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:
parent
a2c7fe03ef
commit
08b1a9d520
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user