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/accelmap.h>
|
||||||
#include <gtkmm/uimanager.h>
|
#include <gtkmm/uimanager.h>
|
||||||
|
|
||||||
|
#include <glibmm/miscutils.h>
|
||||||
|
|
||||||
#include "pbd/error.h"
|
#include "pbd/error.h"
|
||||||
|
|
||||||
#include "gtkmm2ext/actions.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 {
|
struct ActionState {
|
||||||
GtkAction* action;
|
GtkAction* action;
|
||||||
bool sensitive;
|
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 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 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,
|
LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
|
||||||
const char * name, const char * label);
|
const char * name, const char * label);
|
||||||
|
Loading…
Reference in New Issue
Block a user