finch/gntblist.c

branch
soc.2013.gobjectification.plugins
changeset 36488
48c3419844f0
parent 36451
15fb9e64d477
child 36489
6e8edeb3f3f9
--- a/finch/gntblist.c	Sat Aug 10 23:24:36 2013 +0530
+++ b/finch/gntblist.c	Sat Aug 10 23:51:48 2013 +0530
@@ -2450,53 +2450,25 @@
 }
 
 static void
-build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin)
+build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin, gpointer context)
 {
 	GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP);
-	GList *actions, *l;
+	GList *actions;
 	GntMenuItem *menuitem;
 
-	actions = purple_plugin_get_actions(plugin);
-
 	gnt_menuitem_set_submenu(item, GNT_MENU(sub));
-	for (l = actions; l; l = l->next) {
-		if (l->data) {
-			PurplePluginAction *action = l->data;
+	for (actions = PURPLE_PLUGIN_ACTIONS(plugin, context); actions;
+			actions = g_list_delete_link(actions, actions)) {
+		if (actions->data) {
+			PurplePluginAction *action = actions->data;
+			action->plugin = plugin;
+			action->context = context;
 			menuitem = gnt_menuitem_new(action->label);
 			gnt_menu_add_item(GNT_MENU(sub), menuitem);
 
 			gnt_menuitem_set_callback(menuitem, plugin_action, action);
-			g_object_set_data(G_OBJECT(menuitem), "plugin_action", action);
-		}
-	}
-}
-
-static void
-protocol_action(GntMenuItem *item, gpointer data)
-{
-	PurpleProtocolAction *action = data;
-	if (action && action->callback)
-		action->callback(action);
-}
-
-static void
-build_protocol_actions(GntMenuItem *item, PurplePluginProtocolInfo *prpl_info,
-		PurpleConnection *gc)
-{
-	GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP);
-	GList *l;
-	GntMenuItem *menuitem;
-
-	gnt_menuitem_set_submenu(item, GNT_MENU(sub));
-	for (l = prpl_info->actions; l; l = l->next) {
-		if (l->data) {
-			PurpleProtocolAction *action = l->data;
-			action->connection = gc;
-			menuitem = gnt_menuitem_new(action->label);
-			gnt_menu_add_item(GNT_MENU(sub), menuitem);
-
-			gnt_menuitem_set_callback(menuitem, protocol_action, action);
-			g_object_set_data(G_OBJECT(menuitem), "protocol_action", action);
+			g_object_set_data_full(G_OBJECT(menuitem), "plugin_action",
+								   action, (GDestroyNotify)purple_plugin_action_free);
 		}
 	}
 }
@@ -2565,16 +2537,17 @@
 	gnt_menuitem_set_submenu(plg, GNT_MENU(sub));
 
 	for (iter = purple_plugins_get_loaded(); iter; iter = iter->next) {
-		PurplePlugin *plugin = PURPLE_PLUGIN(iter->data);
-		PurplePluginInfo *plugin_info = purple_plugin_get_info(plugin);
+		PurplePlugin *plugin = iter->data;
 		GntMenuItem *item;
-
-		if (!purple_plugin_get_actions(plugin))
+		if (PURPLE_IS_PROTOCOL_PLUGIN(plugin))
+			continue;
+
+		if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin))
 			continue;
 
-		item = gnt_menuitem_new(_(purple_plugin_info_get_name(plugin_info)));
+		item = gnt_menuitem_new(_(plugin->info->name));
 		gnt_menu_add_item(GNT_MENU(sub), item);
-		build_plugin_actions(item, plugin);
+		build_plugin_actions(item, plugin, NULL);
 	}
 }
 
@@ -2599,16 +2572,16 @@
 			iter = g_list_delete_link(iter, iter)) {
 		PurpleAccount *account = iter->data;
 		PurpleConnection *gc = purple_account_get_connection(account);
-		PurplePluginProtocolInfo *prpl_info;
+		PurplePlugin *prpl;
 
 		if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc))
 			continue;
-		prpl_info = purple_connection_get_protocol_info(gc);
-
-		if (prpl_info->actions != NULL) {
+		prpl = purple_connection_get_prpl(gc);
+
+		if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) {
 			item = gnt_menuitem_new(purple_account_get_username(account));
 			gnt_menu_add_item(GNT_MENU(sub), item);
-			build_protocol_actions(item, prpl_info, gc);
+			build_plugin_actions(item, prpl, gc);
 		}
 	}
 }

mercurial