add ActionManager::enable_accelerators(), which takes all known Actions and registers them via the UIManager as accelerators.

This makes them available for use with key bindings/shortcuts/accelerators even if they have no proxy widget
This commit is contained in:
Paul Davis 2014-07-04 07:48:41 -04:00
parent a2c7fe03ef
commit 08b1a9d520
2 changed files with 47 additions and 0 deletions

View File

@ -34,6 +34,8 @@
#include <gtkmm/accelmap.h>
#include <gtkmm/uimanager.h>
#include <glibmm/miscutils.h>
#include "pbd/error.h"
#include "gtkmm2ext/actions.h"
@ -235,6 +237,50 @@ ActionManager::get_all_actions (vector<string>& names, vector<string>& paths, ve
}
}
void
ActionManager::enable_accelerators ()
{
/* 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;
string ui_string = "<ui>";
/* get all actions, build a string describing them all as <accelerator
* action="name"/>
*/
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)) {
ui_string += "<accelerator action=\"";
/* OK, this is pretty stupid ... there is the full
* accel path returned by gtk_action_get_accel_path ()
* but of course the UIManager doesn't use that, but
* just a name, which is the last component of the
* path. What a totally ridiculous design.
*/
string fullpath = gtk_action_get_accel_path ((GtkAction*) acts->data);
ui_string += Glib::path_get_basename (fullpath);
ui_string += "\"/>";
}
}
ui_string += "</ui>";
/* and load it */
ui_manager->add_ui_from_string (ui_string);
}
struct ActionState {
GtkAction* action;
bool sensitive;

View File

@ -50,6 +50,7 @@ namespace ActionManager {
LIBGTKMM2EXT_API extern void set_toggle_action (const char* group, const char* name, bool);
LIBGTKMM2EXT_API extern void add_action_group (Glib::RefPtr<Gtk::ActionGroup>);
LIBGTKMM2EXT_API extern void enable_accelerators ();
LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
const char * name, const char * label);