summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/actions.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-04-17 20:41:31 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-04-17 20:41:31 +0000
commitb9ff443085b0513d95c867cce81595b9509b2dff (patch)
tree63cecbc0b2215cb9dff5935c244e8009a97de1e2 /libs/gtkmm2ext/actions.cc
parenta382da49183c14cb5ab5e3d89c238e7d86de6382 (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.cc44
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)
{