Mercurial > pidgin.yaz
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) |