summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/bindings.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-08-04 13:57:51 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-22 15:31:23 -0500
commite13322e7f5bb1d7f31a867fa10b5b1ef0b8ea804 (patch)
treedf1fd4f53e1a042433ba6fc024d955a92ff24a59 /libs/gtkmm2ext/bindings.cc
parenta13a8da8ac977b247b7c8d8b4f2cfcddfc8996e7 (diff)
bindings: prevent double registration and double signal connection, and provide get_all_actions() methods
Diffstat (limited to 'libs/gtkmm2ext/bindings.cc')
-rw-r--r--libs/gtkmm2ext/bindings.cc146
1 files changed, 120 insertions, 26 deletions
diff --git a/libs/gtkmm2ext/bindings.cc b/libs/gtkmm2ext/bindings.cc
index 6ef2e29196..83e2dcf5b5 100644
--- a/libs/gtkmm2ext/bindings.cc
+++ b/libs/gtkmm2ext/bindings.cc
@@ -611,6 +611,89 @@ Bindings::load (const XMLNode& node)
}
}
+void
+Bindings::get_all_actions (std::vector<std::string>& names,
+ std::vector<std::string>& paths,
+ std::vector<std::string>& tooltips,
+ std::vector<std::string>& keys,
+ std::vector<KeyboardKey>& bindings)
+{
+ if (!action_map) {
+ return;
+ }
+
+ /* build a reverse map from actions to bindings */
+
+ typedef map<Glib::RefPtr<Gtk::Action>,KeyboardKey> ReverseMap;
+ ReverseMap rmap;
+
+ for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ rmap.insert (make_pair (k->second, k->first));
+ }
+
+ /* get a list of all actions */
+
+ ActionMap::Actions actions;
+ action_map->get_actions (actions);
+
+ for (ActionMap::Actions::const_iterator act = actions.begin(); act != actions.end(); ++act) {
+ names.push_back ((*act)->get_name());
+ paths.push_back ((*act)->get_accel_path());
+ tooltips.push_back ((*act)->get_tooltip());
+
+ ReverseMap::iterator r = rmap.find (*act);
+ if (r != rmap.end()) {
+ keys.push_back (gtk_accelerator_get_label (r->second.key(), (GdkModifierType) r->second.state()));
+ bindings.push_back (r->second);
+ } else {
+ keys.push_back (string());
+ bindings.push_back (KeyboardKey::null_key());
+ }
+ }
+}
+
+void
+Bindings::get_all_actions (std::vector<std::string>& groups,
+ std::vector<std::string>& paths,
+ std::vector<std::string>& tooltips,
+ std::vector<KeyboardKey>& bindings)
+{
+ /* build a reverse map from actions to bindings */
+
+ typedef map<Glib::RefPtr<Gtk::Action>,KeyboardKey> ReverseMap;
+ ReverseMap rmap;
+
+ for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+ rmap.insert (make_pair (k->second, k->first));
+ }
+
+ /* get a list of all actions */
+
+ ActionMap::Actions actions;
+ action_map->get_actions (actions);
+
+ for (ActionMap::Actions::const_iterator act = actions.begin(); act != actions.end(); ++act) {
+ groups.push_back ((*act)->get_name());
+ paths.push_back ((*act)->get_accel_path());
+ tooltips.push_back ((*act)->get_tooltip());
+
+ ReverseMap::iterator r = rmap.find (*act);
+ if (r != rmap.end()) {
+ bindings.push_back (r->second);
+ } else {
+ bindings.push_back (KeyboardKey::null_key());
+ }
+ }
+}
+
+void
+ActionMap::get_actions (ActionMap::Actions& acts)
+{
+ for (_ActionMap::iterator a = actions.begin(); a != actions.end(); ++a) {
+ acts.push_back (a->second);
+ }
+}
+
RefPtr<Action>
ActionMap::find_action (const string& name)
{
@@ -647,10 +730,13 @@ ActionMap::register_action (RefPtr<ActionGroup> group, const char* name, const c
fullpath += '/';
fullpath += name;
- actions.insert (_ActionMap::value_type (fullpath, act));
- group->add (act);
-
- return act;
+ if (actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act);
+ return act;
+ }
+
+ /* already registered */
+ return RefPtr<Action> ();
}
RefPtr<Action>
@@ -661,16 +747,17 @@ ActionMap::register_action (RefPtr<ActionGroup> group,
RefPtr<Action> act = Action::create (name, label);
- act->signal_activate().connect (sl);
-
fullpath = group->get_name();
fullpath += '/';
fullpath += name;
- actions.insert (_ActionMap::value_type (fullpath, act));
- group->add (act, sl);
+ if (actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
- return act;
+ /* already registered */
+ return RefPtr<Action>();
}
RefPtr<Action>
@@ -684,15 +771,17 @@ ActionMap::register_radio_action (RefPtr<ActionGroup> group,
RefPtr<Action> act = RadioAction::create (rgroup, name, label);
RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
- act->signal_activate().connect (sl);
-
fullpath = group->get_name();
fullpath += '/';
fullpath += name;
- actions.insert (_ActionMap::value_type (fullpath, act));
- group->add (act, sl);
- return act;
+ if (actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
+
+ /* already registered */
+ return RefPtr<Action>();
}
RefPtr<Action>
@@ -708,15 +797,18 @@ ActionMap::register_radio_action (RefPtr<ActionGroup> group,
RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
ract->property_value() = value;
- act->signal_activate().connect (sigc::bind (sl, act->gobj()));
-
fullpath = group->get_name();
fullpath += '/';
fullpath += name;
- actions.insert (_ActionMap::value_type (fullpath, act));
- group->add (act, sigc::bind (sl, act->gobj()));
- return act;
+ if (actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sigc::bind (sl, act->gobj()));
+ return act;
+ }
+
+ /* already registered */
+
+ return RefPtr<Action>();
}
RefPtr<Action>
@@ -725,17 +817,19 @@ ActionMap::register_toggle_action (RefPtr<ActionGroup> group,
{
string fullpath;
- RefPtr<Action> act = ToggleAction::create (name, label);
-
- act->signal_activate().connect (sl);
-
fullpath = group->get_name();
fullpath += '/';
fullpath += name;
- actions.insert (_ActionMap::value_type (fullpath, act));
- group->add (act, sl);
- return act;
+ RefPtr<Action> act = ToggleAction::create (name, label);
+
+ if (actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+ group->add (act, sl);
+ return act;
+ }
+
+ /* already registered */
+ return RefPtr<Action>();
}
std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k) {