diff console/gntblist.c @ 14616:f1f1dcb26d89

[gaim-migrate @ 17344] Add a barebone menu in the buddylist for account actions. (Press Ctrl+o) committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sun, 24 Sep 2006 17:07:38 +0000
parents 81650a27f253
children 275c84b1b2a4
line wrap: on
line diff
--- a/console/gntblist.c	Sun Sep 24 16:35:31 2006 +0000
+++ b/console/gntblist.c	Sun Sep 24 17:07:38 2006 +0000
@@ -39,6 +39,7 @@
 #include "gntlabel.h"
 #include "gntline.h"
 #include "gnttree.h"
+#include "gntwindow.h"
 
 #include "gntblist.h"
 #include "gntconv.h"
@@ -483,6 +484,8 @@
 				gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)),
 				group, NULL);
 
+	/* XXX: This causes problem because you can close a chat window, hide the buddylist.
+	 * When you show the buddylist, you automatically join the chat again. */
 	if (gaim_blist_node_get_bool((GaimBlistNode*)chat, "gnt-autojoin"))
 		serv_join_chat(gaim_account_get_connection(chat->account), chat->components);
 }
@@ -1608,6 +1611,75 @@
 	return FALSE;
 }
 
+static void
+plugin_action(GntMenuItem *item, gpointer data)
+{
+	GaimPluginAction *action = data;
+	if (action && action->callback)
+		action->callback(action);
+}
+
+static void
+reconstruct_accounts_menu()
+{
+	GntWidget *menu, *sub;
+	GntMenuItem *item;
+	GntWindow *window;
+	GList *iter;
+
+	if (!ggblist)
+		return;
+
+	window  = GNT_WINDOW(ggblist->window);
+
+	menu = gnt_menu_new(GNT_MENU_TOPLEVEL);
+	gnt_window_set_menu(window, GNT_MENU(menu));
+
+	item = gnt_menuitem_new(_("Accounts"));
+	gnt_menu_add_item(GNT_MENU(menu), item);
+
+	sub = gnt_menu_new(GNT_MENU_POPUP);
+	gnt_menuitem_set_submenu(item, GNT_MENU(sub));
+
+	for (iter = gaim_accounts_get_all_active(); iter;
+			iter = g_list_delete_link(iter, iter)) {
+		GaimAccount *account = iter->data;
+		GaimConnection *gc = gaim_account_get_connection(account);
+		GaimPlugin *prpl;
+		
+		if (!GAIM_CONNECTION_IS_CONNECTED(gc))
+			continue;
+		prpl = gc->prpl;
+
+		if (GAIM_PLUGIN_HAS_ACTIONS(prpl)) {
+			GList *acts;
+			GntWidget *s;
+
+			item = gnt_menuitem_new(gaim_account_get_username(account));
+			s = gnt_menu_new(GNT_MENU_POPUP);
+			gnt_menuitem_set_submenu(item, GNT_MENU(s));
+			gnt_menu_add_item(GNT_MENU(sub), item);
+
+			for (acts = GAIM_PLUGIN_ACTIONS(prpl, gc); acts;
+					acts = g_list_delete_link(acts, acts)) {
+				GaimPluginAction *action = acts->data;
+				if (!action)
+					continue;
+
+				action->plugin = prpl;
+				action->context = gc;
+
+				item = gnt_menuitem_new(action->label);
+				gnt_menuitem_set_callback(item, plugin_action, action);
+				/* This is to make sure the action is freed when the menu is destroyed */
+				g_object_set_data_full(G_OBJECT(item), "plugin_action", action,
+					(GDestroyNotify)gaim_plugin_action_free);
+				gnt_menu_add_item(GNT_MENU(s), item);
+			}
+		}
+	}
+}
+
 void gg_blist_show()
 {
 	if (ggblist)
@@ -1617,7 +1689,7 @@
 
 	gaim_get_blist()->ui_data = ggblist;
 
-	ggblist->window = gnt_vbox_new(FALSE);
+	ggblist->window = gnt_vwindow_new(FALSE);
 	gnt_widget_set_name(ggblist->window, "buddylist");
 	gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE);
 	gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List"));
@@ -1641,6 +1713,10 @@
 
 	gnt_widget_show(ggblist->window);
 
+	gaim_signal_connect(gaim_connections_get_handle(), "signed-on", gg_blist_get_handle(),
+				GAIM_CALLBACK(reconstruct_accounts_menu), NULL);
+	gaim_signal_connect(gaim_connections_get_handle(), "signed-off", gg_blist_get_handle(),
+				GAIM_CALLBACK(reconstruct_accounts_menu), NULL);
 	gaim_signal_connect(gaim_blist_get_handle(), "buddy-status-changed", gg_blist_get_handle(),
 				GAIM_CALLBACK(buddy_status_changed), ggblist);
 	gaim_signal_connect(gaim_blist_get_handle(), "buddy-idle-changed", gg_blist_get_handle(),
@@ -1682,6 +1758,8 @@
 	g_signal_connect(G_OBJECT(ggblist->statustext), "key_pressed",
 				G_CALLBACK(status_text_changed), NULL);
 
+	reconstruct_accounts_menu(ggblist);
+
 	populate_buddylist();
 
 	savedstatus_changed(gaim_savedstatus_get_current(), NULL);