comparison src/gtkblist.c @ 12333:354af9ab4ed3

[gaim-migrate @ 14637] Put plugin actions within a submenu named after the plugin committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 05 Dec 2005 02:18:43 +0000
parents 607108495e92
children 2823118073fa
comparison
equal deleted inserted replaced
12332:720fb68418d8 12333:354af9ab4ed3
2476 { N_("/Tools/Buddy _Pounces"), NULL, gaim_gtk_pounces_manager_show, 0, "<StockItem>", GAIM_STOCK_POUNCE }, 2476 { N_("/Tools/Buddy _Pounces"), NULL, gaim_gtk_pounces_manager_show, 0, "<StockItem>", GAIM_STOCK_POUNCE },
2477 { N_("/Tools/Plu_gins"), "<CTL>U", gaim_gtk_plugin_dialog_show, 0, "<StockItem>", GAIM_STOCK_PLUGIN }, 2477 { N_("/Tools/Plu_gins"), "<CTL>U", gaim_gtk_plugin_dialog_show, 0, "<StockItem>", GAIM_STOCK_PLUGIN },
2478 { N_("/Tools/Pr_eferences"), "<CTL>P", gaim_gtk_prefs_show, 0, "<StockItem>", GTK_STOCK_PREFERENCES }, 2478 { N_("/Tools/Pr_eferences"), "<CTL>P", gaim_gtk_prefs_show, 0, "<StockItem>", GTK_STOCK_PREFERENCES },
2479 { N_("/Tools/Pr_ivacy"), NULL, gaim_gtk_privacy_dialog_show, 0, "<StockItem>", GTK_STOCK_DIALOG_ERROR }, 2479 { N_("/Tools/Pr_ivacy"), NULL, gaim_gtk_privacy_dialog_show, 0, "<StockItem>", GTK_STOCK_DIALOG_ERROR },
2480 { "/Tools/sep2", NULL, NULL, 0, "<Separator>" }, 2480 { "/Tools/sep2", NULL, NULL, 0, "<Separator>" },
2481 { N_("/Tools/_Debug Window"), NULL, toggle_debug, 0, "<StockItem>", GAIM_STOCK_DEBUG },
2482 { N_("/Tools/_File Transfers"), "<CTL>T", gaim_show_xfer_dialog, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, 2481 { N_("/Tools/_File Transfers"), "<CTL>T", gaim_show_xfer_dialog, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER },
2483 { N_("/Tools/R_oom List"), NULL, gaim_gtk_roomlist_dialog_show, 0, "<StockItem>", GTK_STOCK_INDEX }, 2482 { N_("/Tools/R_oom List"), NULL, gaim_gtk_roomlist_dialog_show, 0, "<StockItem>", GTK_STOCK_INDEX },
2484 { N_("/Tools/View System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, "<StockItem>", GAIM_STOCK_LOG }, 2483 { N_("/Tools/View System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, "<StockItem>", GAIM_STOCK_LOG },
2485 { "/Tools/sep3", NULL, NULL, 0, "<Separator>" }, 2484 { "/Tools/sep3", NULL, NULL, 0, "<Separator>" },
2486 { N_("/Tools/Mute _Sounds"), "<CTL>S", gaim_gtk_blist_mute_sounds_cb, 0, "<CheckItem>"}, 2485 { N_("/Tools/Mute _Sounds"), "<CTL>S", gaim_gtk_blist_mute_sounds_cb, 0, "<CheckItem>"},
2487 2486
2488 /* Help */ 2487 /* Help */
2489 { N_("/_Help"), NULL, NULL, 0, "<Branch>" }, 2488 { N_("/_Help"), NULL, NULL, 0, "<Branch>" },
2490 { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP }, 2489 { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP },
2490 { N_("/Help/_Debug Window"), NULL, toggle_debug, 0, "<StockItem>", GAIM_STOCK_DEBUG },
2491 { N_("/Help/_About"), NULL, gaim_gtkdialogs_about, 0, "<StockItem>", GAIM_STOCK_ABOUT }, 2491 { N_("/Help/_About"), NULL, gaim_gtkdialogs_about, 0, "<StockItem>", GAIM_STOCK_ABOUT },
2492 }; 2492 };
2493 2493
2494 /********************************************************* 2494 /*********************************************************
2495 * Private Utility functions * 2495 * Private Utility functions *
5284 { 5284 {
5285 if (pam->callback) 5285 if (pam->callback)
5286 pam->callback(pam); 5286 pam->callback(pam);
5287 } 5287 }
5288 5288
5289 static GList *plugin_menu_items = NULL;
5290 static int plugin_menu_index = 10;
5291
5292 static void 5289 static void
5293 build_plugin_actions(GtkWidget *menu, GaimPlugin *plugin, gpointer context) 5290 build_plugin_actions(GtkWidget *menu, GaimPlugin *plugin)
5294 { 5291 {
5295 GtkWidget *menuitem = NULL; 5292 GtkWidget *menuitem;
5296 GaimPluginAction *action = NULL; 5293 GaimPluginAction *action = NULL;
5297 GList *l, *ll; 5294 GList *actions, *l;
5298 5295
5299 for (l = ll = GAIM_PLUGIN_ACTIONS(plugin, context); l; l = l->next) { 5296 actions = GAIM_PLUGIN_ACTIONS(plugin, NULL);
5300 if (l->data) { 5297
5298 for (l = actions; l != NULL; l = l->next)
5299 {
5300 if (l->data)
5301 {
5301 action = (GaimPluginAction *) l->data; 5302 action = (GaimPluginAction *) l->data;
5302 action->plugin = plugin; 5303 action->plugin = plugin;
5303 action->context = context; 5304 action->context = NULL;
5304 5305
5305 menuitem = gtk_menu_item_new_with_label(action->label); 5306 menuitem = gtk_menu_item_new_with_label(action->label);
5306 if (context) { 5307 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
5307 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); 5308
5308 } else {
5309 plugin_menu_items = g_list_append(plugin_menu_items, menuitem);
5310 plugin_menu_index++;
5311 gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuitem, plugin_menu_index);
5312 }
5313 g_signal_connect(G_OBJECT(menuitem), "activate", 5309 g_signal_connect(G_OBJECT(menuitem), "activate",
5314 G_CALLBACK(plugin_act), action); 5310 G_CALLBACK(plugin_act), action);
5315 g_object_set_data(G_OBJECT(menuitem), "plugin_action", action); 5311 g_object_set_data(G_OBJECT(menuitem), "plugin_action", action);
5316 gtk_widget_show(menuitem); 5312 gtk_widget_show(menuitem);
5317 } 5313 }
5318 else 5314 else
5319 gaim_separator(menu); 5315 gaim_separator(menu);
5320 } 5316 }
5321 5317
5322 g_list_free(ll); 5318 g_list_free(actions);
5323 } 5319 }
5324 5320
5325 static void 5321 static void
5326 modify_account_cb(GtkWidget *widget, gpointer data) 5322 modify_account_cb(GtkWidget *widget, gpointer data)
5327 { 5323 {
5507 } 5503 }
5508 } 5504 }
5509 } 5505 }
5510 } 5506 }
5511 5507
5508 static GList *plugin_submenus = NULL;
5509
5512 void 5510 void
5513 gaim_gtk_blist_update_plugin_actions(void) 5511 gaim_gtk_blist_update_plugin_actions(void)
5514 { 5512 {
5515 GtkWidget *menuitem; 5513 GtkWidget *menuitem, *submenu;
5516 GaimPlugin *plugin = NULL; 5514 GaimPlugin *plugin = NULL;
5517 GList *l; 5515 GList *l;
5518 int count = 0;
5519 5516
5520 GtkWidget *pluginmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools")); 5517 GtkWidget *pluginmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools"));
5521 5518
5522 if (pluginmenu == NULL) 5519 g_return_if_fail(pluginmenu != NULL);
5523 return; 5520
5524 5521 /* Remove old plugin action submenus from the Tools menu */
5525 /* Clear the old Account Actions menu */ 5522 for (l = plugin_submenus; l; l = l->next)
5526 for (l = plugin_menu_items; l; l = l->next) { 5523 {
5527 GaimPluginAction *action; 5524 GList *menuitems;
5528 plugin_menu_index--; 5525
5529 menuitem = l->data; 5526 submenu = l->data;
5530 action = g_object_get_data(G_OBJECT(menuitem), "plugin_action"); 5527
5531 g_free(action); 5528 menuitems = gtk_container_get_children(GTK_CONTAINER(submenu));
5532 5529 while (menuitems != NULL)
5533 gtk_container_remove(GTK_CONTAINER(pluginmenu), GTK_WIDGET(menuitem)); 5530 {
5534 } 5531 GaimPluginAction *action;
5535 g_list_free(plugin_menu_items); 5532 menuitem = menuitems->data;
5536 plugin_menu_items = NULL; 5533 action = g_object_get_data(G_OBJECT(menuitem), "plugin_action");
5537 5534 g_free(action);
5538 /* Count the number of plugins with actions */ 5535 menuitems = g_list_delete_link(menuitems, menuitems);
5539 for (l = gaim_plugins_get_loaded(); l; l = l->next) { 5536 }
5540 plugin = (GaimPlugin *) l->data; 5537
5541 5538 gtk_container_remove(GTK_CONTAINER(pluginmenu), GTK_WIDGET(submenu));
5542 if (!GAIM_IS_PROTOCOL_PLUGIN(plugin) && GAIM_PLUGIN_HAS_ACTIONS(plugin)) 5539 }
5543 count++; 5540 g_list_free(plugin_submenus);
5544 5541 plugin_submenus = NULL;
5545 /* no need to count past 2, so don't */ 5542
5546 if (count > 1) 5543 /* Add a submenu for each plugin with custom actions */
5547 break;
5548 }
5549
5550 for (l = gaim_plugins_get_loaded(); l; l = l->next) { 5544 for (l = gaim_plugins_get_loaded(); l; l = l->next) {
5551 5545
5552 plugin = (GaimPlugin *) l->data; 5546 plugin = (GaimPlugin *) l->data;
5553 5547
5554 if (GAIM_IS_PROTOCOL_PLUGIN(plugin)) 5548 if (GAIM_IS_PROTOCOL_PLUGIN(plugin))
5555 continue; 5549 continue;
5556 5550
5557 if (!GAIM_PLUGIN_HAS_ACTIONS(plugin)) 5551 if (!GAIM_PLUGIN_HAS_ACTIONS(plugin))
5558 continue; 5552 continue;
5559 5553
5560 build_plugin_actions(pluginmenu, plugin, NULL); 5554 menuitem = gtk_image_menu_item_new_with_label(plugin->info->name);
5555 gtk_menu_shell_append(GTK_MENU_SHELL(pluginmenu), menuitem);
5556 gtk_widget_show(menuitem);
5557
5558 plugin_submenus = g_list_append(plugin_submenus, menuitem);
5559
5560 submenu = gtk_menu_new();
5561 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
5562 gtk_widget_show(submenu);
5563
5564 build_plugin_actions(submenu, plugin);
5561 } 5565 }
5562 } 5566 }
5563 5567
5564 static void 5568 static void
5565 sortmethod_act(GtkCheckMenuItem *checkmenuitem, char *id) 5569 sortmethod_act(GtkCheckMenuItem *checkmenuitem, char *id)