diff -Naur /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/arprof gtk2_ardour/arprof --- /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/arprof 2009-11-05 14:26:38.000000000 -0430 +++ gtk2_ardour/arprof 2009-11-06 11:10:15.000000000 -0430 @@ -5,5 +5,5 @@ gcc -shared -nostdlib -fPIC gprofhelper.c -o gprofhelper.so -lpthread -ldl || exit 1 fi -. ardev_common.sh +source ./ardev_common.sh LDPRELOAD=./gprofhelper.so $EXECUTABLE "$@" diff -Naur /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/plugin_selector.cc gtk2_ardour/plugin_selector.cc --- /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/plugin_selector.cc 2009-11-05 14:26:39.000000000 -0430 +++ gtk2_ardour/plugin_selector.cc 2009-11-06 14:25:40.000000000 -0430 @@ -485,7 +485,7 @@ filter_entry.grab_focus (); } -struct PluginMenuCompare { +struct PluginMenuCompareByCreator { bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { int cmp; @@ -503,28 +503,45 @@ } }; -Gtk::Menu& -PluginSelector::plugin_menu() -{ - using namespace Menu_Helpers; +struct PluginMenuCompareByName { + bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { + int cmp; - typedef std::map SubmenuMap; - SubmenuMap submenu_map; + cmp = strcasecmp (a->name.c_str(), b->name.c_str()); - if (!_menu) { - _menu = new Menu(); - _menu->set_name("ArdourContextMenu"); - } + if (cmp < 0) { + return true; + } else if (cmp == 0) { + /* same name ... compare type */ + if (a->type < b->type) { + return true; + } + } + return false; + } +}; - MenuList& items = _menu->items(); - Menu* favs = new Menu(); - favs->set_name("ArdourContextMenu"); +struct PluginMenuCompareByCategory { + bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { + int cmp; - items.clear (); - items.push_back (MenuElem (_("Favorites"), *favs)); - items.push_back (MenuElem (_("Plugin Manager"), mem_fun (*this, &PluginSelector::show_manager))); - items.push_back (SeparatorElem ()); + cmp = strcasecmp (a->category.c_str(), b->category.c_str()); + if (cmp < 0) { + return true; + } else if (cmp == 0) { + /* same category ... compare names */ + if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { + return true; + } + } + return false; + } +}; + +Gtk::Menu& +PluginSelector::plugin_menu() +{ PluginInfoList all_plugs; all_plugs.insert (all_plugs.end(), manager->ladspa_plugin_info().begin(), manager->ladspa_plugin_info().end()); @@ -538,38 +555,118 @@ all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end()); #endif - PluginMenuCompare cmp; - all_plugs.sort (cmp); + using namespace Menu_Helpers; - for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { - SubmenuMap::iterator x; - Gtk::Menu* submenu; + if (!_menu) { + _menu = new Menu(); + _menu->set_name("ArdourContextMenu"); + } - string creator = (*i)->creator; - string::size_type pos = 0; + MenuList& items = _menu->items(); + items.clear (); + + Gtk::Menu* favs = create_favs_menu(all_plugs); + items.push_back (MenuElem (_("Favorites"), *favs)); + + items.push_back (MenuElem (_("Plugin Manager"), mem_fun (*this, &PluginSelector::show_manager))); + items.push_back (SeparatorElem ()); + + Menu* by_creator = create_by_creator_menu(all_plugs); + by_creator->set_name("ArdourContextMenu"); + items.push_back (MenuElem (_("By Creator"), *by_creator)); + + Menu* by_category = create_by_category_menu(all_plugs); + by_category->set_name("ArdourContextMenu"); + items.push_back (MenuElem (_("By Category"), *by_category)); + + return *_menu; +} + +Gtk::Menu* +PluginSelector::create_favs_menu (PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; + Menu* favs = new Menu(); + favs->set_name("ArdourContextMenu"); + + PluginMenuCompareByName cmp_by_name; + all_plugs.sort (cmp_by_name); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { if (manager->is_a_favorite_plugin (*i)) { favs->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } - - /* stupid LADSPA creator strings */ - - while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos; - creator = creator.substr (0, pos); + } + return favs; +} + +Gtk::Menu* +PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; - if ((x = submenu_map.find (creator)) != submenu_map.end()) { + typedef std::map SubmenuMap; + SubmenuMap creator_submenu_map; + + Menu* by_creator = new Menu(); + by_creator->set_name("ArdourContextMenu"); + + MenuList& by_creator_items = by_creator->items(); + PluginMenuCompareByCreator cmp_by_creator; + all_plugs.sort (cmp_by_creator); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { + + string creator = (*i)->creator; + + SubmenuMap::iterator x; + Gtk::Menu* submenu; + if ((x = creator_submenu_map.find (creator)) != creator_submenu_map.end()) { submenu = x->second; } else { submenu = new Gtk::Menu; - items.push_back (MenuElem (creator, *submenu)); - submenu_map.insert (pair (creator, submenu)); + by_creator_items.push_back (MenuElem (creator, *submenu)); + creator_submenu_map.insert (pair (creator, submenu)); submenu->set_name("ArdourContextMenu"); } - submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } - - return *_menu; + return by_creator; +} + +Gtk::Menu* +PluginSelector::create_by_category_menu (ARDOUR::PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; + + typedef std::map SubmenuMap; + SubmenuMap category_submenu_map; + + Menu* by_category = new Menu(); + by_category->set_name("ArdourContextMenu"); + + MenuList& by_category_items = by_category->items(); + PluginMenuCompareByCategory cmp_by_category; + all_plugs.sort (cmp_by_category); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { + + string category = (*i)->category; + + SubmenuMap::iterator x; + Gtk::Menu* submenu; + if ((x = category_submenu_map.find (category)) != category_submenu_map.end()) { + submenu = x->second; + } else { + submenu = new Gtk::Menu; + by_category_items.push_back (MenuElem (category, *submenu)); + category_submenu_map.insert (pair (category, submenu)); + submenu->set_name("ArdourContextMenu"); + } + submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); + } + return by_category; } void diff -Naur /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/plugin_selector.h gtk2_ardour/plugin_selector.h --- /home/jabel/builds/ardour2-debug/src/2.8.3/gtk2_ardour/plugin_selector.h 2009-11-05 14:26:39.000000000 -0430 +++ gtk2_ardour/plugin_selector.h 2009-11-06 14:17:08.000000000 -0430 @@ -126,6 +126,10 @@ void plugin_chosen_from_menu (const ARDOUR::PluginInfoPtr&); Gtk::Menu* _menu; + + Gtk::Menu* create_favs_menu (ARDOUR::PluginInfoList&); + Gtk::Menu* create_by_creator_menu (ARDOUR::PluginInfoList&); + Gtk::Menu* create_by_category_menu (ARDOUR::PluginInfoList&); }; #endif // __ardour_plugin_selector_h__ diff -Naur /home/jabel/builds/ardour2-debug/src/2.8.3/libs/ardour/plugin_manager.cc libs/ardour/plugin_manager.cc --- /home/jabel/builds/ardour2-debug/src/2.8.3/libs/ardour/plugin_manager.cc 2009-11-05 14:27:40.000000000 -0430 +++ libs/ardour/plugin_manager.cc 2009-11-06 10:49:20.000000000 -0430 @@ -338,12 +338,17 @@ PluginInfoPtr info(new LadspaPluginInfo); info->name = descriptor->Name; info->category = get_ladspa_category(descriptor->UniqueID); - info->creator = descriptor->Maker; info->path = path; info->index = i; info->n_inputs = 0; info->n_outputs = 0; info->type = ARDOUR::LADSPA; + + info->creator = descriptor->Maker; + /* stupid LADSPA creator strings */ + string::size_type pos = 0; + while (pos < info->creator.length() && (isalnum (info->creator[pos]) || isspace (info->creator[pos]))) ++pos; + info->creator = info->creator.substr (0, pos); char buf[32]; snprintf (buf, sizeof (buf), "%lu", descriptor->UniqueID); @@ -400,7 +405,7 @@ lrdf_statement* matches1 = lrdf_matches (&pattern); if (!matches1) { - return ""; + return "Unknown"; } pattern.subject = matches1->object; @@ -412,7 +417,7 @@ lrdf_free_statements(matches1); if (!matches2) { - return (""); + return ("Unknown"); } string label = matches2->object;