X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Factions.cc;h=84a738f278559a84f1a6149327d6e9a8bbaa3abf;hb=66292718a1bde5d333b63c07c19d8d0d187cfc2e;hp=1380d49ae8631ee94eb682e9c351e59d7583f9b1;hpb=4cca76853396f5c4090c3be547b0df4b5f0d02d0;p=ardour.git diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index 1380d49ae8..84a738f278 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -243,6 +243,40 @@ ActionManager::get_widget (const char * name) return ui_manager->get_widget (name); } +RefPtr +ActionManager::get_action (const char* path) +{ + if (!path) { + return RefPtr(); + } + + /* Skip / in path */ + + int len = strlen (path); + + if (len < 3) { + /* shortest possible path: "a/b" */ + return RefPtr(); + } + + if (len > 10 && !strncmp (path, "/", 10 )) { + path = path+10; + } else if (path[0] == '/') { + path++; + } + + char copy[len+1]; + strcpy (copy, path); + char* slash = strchr (copy, '/'); + if (!slash) { + return RefPtr (); + } + *slash = '\0'; + + return get_action (copy, ++slash); + +} + RefPtr ActionManager::get_action (const char* group_name, const char* action_name) { @@ -276,6 +310,32 @@ ActionManager::get_action (const char* group_name, const char* action_name) return act; } +RefPtr +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(); +} + void ActionManager::set_sensitive (vector >& actions, bool state) { @@ -284,8 +344,20 @@ ActionManager::set_sensitive (vector >& actions, bool state) } } +void +ActionManager::check_toggleaction (string n) +{ + set_toggleaction_state (n, true); +} + void ActionManager::uncheck_toggleaction (string n) +{ + set_toggleaction_state (n, false); +} + +void +ActionManager::set_toggleaction_state (string n, bool s) { char const * name = n.c_str (); @@ -309,7 +381,7 @@ ActionManager::uncheck_toggleaction (string n) RefPtr act = get_action (group_name, action_name); if (act) { RefPtr tact = RefPtr::cast_dynamic(act); - tact->set_active (false); + tact->set_active (s); } else { error << string_compose (_("Unknown action name: %1"), name) << endmsg; }