X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Factions.cc;h=74533f96a4b087393164fcfbeeb857fdb707a00c;hb=99c1aacc236fcba1f297804baf9f5d1b0825e2ee;hp=2bbb1520f1321f3cf38169aa584dc6f59b14d034;hpb=2304a51b85830753e68450bde1d62686358fff09;p=ardour.git diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index 2bbb1520f1..74533f96a4 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -246,14 +246,35 @@ ActionManager::get_widget (const char * name) RefPtr ActionManager::get_action (const char* path) { - GtkAction* _act; - RefPtr act; + if (!path) { + return RefPtr(); + } + + /* Skip / in path */ - if ((_act = gtk_ui_manager_get_action (ui_manager->gobj(), path)) != 0) { - return Glib::wrap (_act, true); + int len = strlen (path); + + if (len < 3) { + /* shortest possible path: "a/b" */ + return RefPtr(); } - return act; + 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 @@ -289,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) { @@ -338,8 +385,30 @@ ActionManager::get_key_representation (const string& accel_path, AccelKey& key) if (known) { uint32_t k = possibly_translate_legal_accelerator_to_real_key (key.get_key()); key = AccelKey (k, Gdk::ModifierType (key.get_mod())); - return ui_manager->get_accel_group()->name (key.get_key(), Gdk::ModifierType (key.get_mod())); + return ui_manager->get_accel_group()->get_label (key.get_key(), Gdk::ModifierType (key.get_mod())); } return unbound_string; } + +void +ActionManager::do_action (const char* group, const char*action) +{ + Glib::RefPtr act = ActionManager::get_action (group, action); + if (act) { + act->activate (); + } +} + +void +ActionManager::set_toggle_action (const char* group, const char*action, bool yn) +{ + Glib::RefPtr act = ActionManager::get_action (group, action); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (tact) { + tact->set_active (yn); + } + } +} +