diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-04-17 20:41:31 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-04-17 20:41:31 +0000 |
commit | b9ff443085b0513d95c867cce81595b9509b2dff (patch) | |
tree | 63cecbc0b2215cb9dff5935c244e8009a97de1e2 /libs/gtkmm2ext/actions.cc | |
parent | a382da49183c14cb5ab5e3d89c238e7d86de6382 (diff) |
MCP: various work on the button binding GUI
git-svn-id: svn://localhost/ardour2/branches/3.0@11997 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/gtkmm2ext/actions.cc')
-rw-r--r-- | libs/gtkmm2ext/actions.cc | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index 774991038e..3fc9def399 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -246,9 +246,23 @@ ActionManager::get_widget (const char * name) RefPtr<Action> ActionManager::get_action (const char* path) { + if (!path) { + return RefPtr<Action>(); + } + char copy[strlen(path)+1]; - strcpy (copy, path); - char *slash = strchr (copy, '/'); + + if (*path == '/') { + const char* cslash = strchr (path, '/'); + if (!cslash) { + return RefPtr<Action> (); + } + strcpy (copy, cslash+1); + } else { + strcpy (copy, path); + } + + char* slash = strchr (copy, '/'); if (!slash) { return RefPtr<Action> (); } @@ -290,6 +304,32 @@ ActionManager::get_action (const char* group_name, const char* action_name) return act; } +RefPtr<Action> +ActionManager::get_action_from_name (const char* name) +{ + /* the C++ API for functions used here appears to be broken in + gtkmm2.6, so we fall back to the C level. + */ + + GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj()); + GList* node; + GList* acts; + + for (node = list; node; node = g_list_next (node)) { + + GtkActionGroup* group = (GtkActionGroup*) node->data; + + for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) { + GtkAction* action = (GtkAction*) acts->data; + if (!strcmp (gtk_action_get_name (action), name)) { + return Glib::wrap (action, true); + } + } + } + + return RefPtr<Action>(); +} + void ActionManager::set_sensitive (vector<RefPtr<Action> >& actions, bool state) { |