diff options
Diffstat (limited to 'gtk2_ardour/actions.cc')
-rw-r--r-- | gtk2_ardour/actions.cc | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc index 0dca875e3f..8a50451cb5 100644 --- a/gtk2_ardour/actions.cc +++ b/gtk2_ardour/actions.cc @@ -20,6 +20,8 @@ #include <vector> #include <gtk/gtkaccelmap.h> +#include <gtk/gtkuimanager.h> +#include <gtk/gtkactiongroup.h> #include <gtkmm/accelmap.h> #include <gtkmm/uimanager.h> @@ -192,7 +194,42 @@ ActionManager::get_widget (ustring name) RefPtr<Action> ActionManager::get_action (ustring name) { - return ui_manager->get_action (name); + // ListHandle<RefPtr<ActionGroup> > uim_groups = ui_manager->get_action_groups (); + GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj()); + GList* node; + RefPtr<Action> act; + + if (name.substr (0,9) != "<Actions>") { + cerr << "badly specified action name" << endl; + return act; + } + + ustring::size_type last_slash = name.find_last_of ('/'); + ustring group_name = name.substr (10, last_slash - 10); + cerr << "group name = " << group_name << endl; + ustring action_name = name.substr (last_slash+1); + cerr << "action name = " << action_name << endl; + + cerr << "there are " << g_list_length (list) << " action roups\n"; + + for (node = list; node; node = g_list_next (node)) { + + GtkActionGroup* _ag = (GtkActionGroup*) node->data; + + cerr << "\tchecking in " << gtk_action_group_get_name (_ag) << endl; + + if (group_name == gtk_action_group_get_name (_ag)) { + + GtkAction* _act; + + if ((_act = gtk_action_group_get_action (_ag, action_name.c_str())) != 0) { + act = Glib::wrap (_act); + break; + } + } + } + + return act; } void |