src/gtkblist.c

changeset 9030
7b574a641391
parent 9019
b9a333b36763
child 9051
aebb592d4529
--- 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,

mercurial