1 #ifndef __libgtkmm2ext_bindings_h__
2 #define __libgtkmm2ext_bindings_h__
10 #include <gdk/gdkkeysyms.h>
11 #include <gtkmm/action.h>
12 #include <gtkmm/radioaction.h>
13 #include <gtkmm/toggleaction.h>
15 #include "pbd/signals.h"
17 #include "gtkmm2ext/visibility.h"
24 class LIBGTKMM2EXT_API KeyboardKey
28 _val = GDK_VoidSymbol;
31 KeyboardKey (uint32_t state, uint32_t keycode);
33 static KeyboardKey null_key() { return KeyboardKey (0, 0); }
35 uint32_t state() const { return _val >> 32; }
36 uint32_t key() const { return _val & 0xffff; }
38 bool operator<(const KeyboardKey& other) const {
39 return _val < other._val;
42 bool operator==(const KeyboardKey& other) const {
43 return _val == other._val;
46 std::string name() const;
47 std::string native_name() const;
48 std::string native_short_name() const;
49 static bool make_key (const std::string&, KeyboardKey&);
51 std::string display_label() const;
57 class LIBGTKMM2EXT_API MouseButton {
63 MouseButton (uint32_t state, uint32_t button_number);
64 uint32_t state() const { return _val >> 32; }
65 uint32_t button() const { return _val & 0xffff; }
67 bool operator<(const MouseButton& other) const {
68 return _val < other._val;
71 bool operator==(const MouseButton& other) const {
72 return _val == other._val;
75 std::string name() const;
76 static bool make_button (const std::string&, MouseButton&);
82 class LIBGTKMM2EXT_API Bindings;
84 class LIBGTKMM2EXT_API ActionMap {
86 ActionMap (std::string const& name);
89 std::string name() const { return _name; }
91 Glib::RefPtr<Gtk::ActionGroup> create_action_group (const std::string& group_name);
93 Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, const char* name, const char* label);
94 Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
95 const char* name, const char* label, sigc::slot<void> sl);
96 Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
97 Gtk::RadioAction::Group&,
98 const char* name, const char* label,
99 sigc::slot<void,GtkAction*> sl,
101 Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
102 Gtk::RadioAction::Group&,
103 const char* name, const char* label,
104 sigc::slot<void> sl);
105 Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
106 const char* name, const char* label, sigc::slot<void> sl);
108 Glib::RefPtr<Gtk::Action> find_action (const std::string& name);
109 Glib::RefPtr<Gtk::Action> find_action (char const * group_name, char const * action_name);
110 Glib::RefPtr<Gtk::ToggleAction> find_toggle_action (const std::string& name);
111 Glib::RefPtr<Gtk::ToggleAction> find_toggle_action (char const * group_name, char const * action_name);
112 Glib::RefPtr<Gtk::RadioAction> find_radio_action (const std::string& name);
113 Glib::RefPtr<Gtk::RadioAction> find_radio_action (char const * group_name, char const * action_name);
115 void set_bindings (Bindings*);
116 Bindings* bindings() const { return _bindings; }
118 typedef std::vector<Glib::RefPtr<Gtk::Action> > Actions;
119 void get_actions (Actions&);
121 static std::list<ActionMap*> action_maps;
123 /* used by control surface protocols and other UIs */
124 static void get_all_actions (std::vector<std::string>& paths,
125 std::vector<std::string>& labels,
126 std::vector<std::string>& tooltips,
127 std::vector<std::string>& keys,
128 std::vector<Glib::RefPtr<Gtk::Action> >& actions);
133 /* hash for faster lookup of actions by name */
135 typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
138 /* initialized to null; set after a Bindings object has ::associated()
139 * itself with this action map.
146 class LIBGTKMM2EXT_API ActionMapOwner {
148 Gtkmm2ext::ActionMap myactions;
150 ActionMapOwner (std::string const & map_name) : myactions (map_name) {}
151 Glib::RefPtr<Gtk::Action> find_action (const std::string& name) { return myactions.find_action (name); }
152 Glib::RefPtr<Gtk::Action> find_action (char const * group_name, char const * action_name) { return myactions.find_action (group_name, action_name); }
154 Gtkmm2ext::ActionMap& action_map() { return myactions; }
157 class LIBGTKMM2EXT_API StaticActionMapOwner {
159 virtual Gtkmm2ext::ActionMap& my_actions() const = 0;
161 virtual ~StaticActionMapOwner() {}
162 Glib::RefPtr<Gtk::Action> find_action (const std::string& name) { return my_actions().find_action (name); }
163 Glib::RefPtr<Gtk::Action> find_action (char const * group_name, char const * action_name) { return my_actions().find_action (group_name, action_name); }
165 Gtkmm2ext::ActionMap& action_map() { return my_actions(); }
168 class LIBGTKMM2EXT_API Bindings {
176 ActionInfo (std::string const& name) : action_name (name) {}
177 ActionInfo (std::string const& name, std::string const& grp) : action_name (name), group_name (grp) {}
179 std::string action_name;
180 std::string group_name; /* may be empty */
181 Glib::RefPtr<Gtk::Action> action;
183 typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
185 Bindings (std::string const& name);
188 std::string const& name() const { return _name; }
194 bool empty_keys () const;
195 bool empty_mouse () const;
197 bool add (KeyboardKey, Operation, std::string const&, XMLProperty const*, bool can_save = false);
198 bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true);
199 bool remove (Operation, std::string const& action_name, bool can_save = false);
201 bool activate (KeyboardKey, Operation);
203 void add (MouseButton, Operation, std::string const&, XMLProperty const*);
204 void remove (MouseButton, Operation);
205 bool activate (MouseButton, Operation);
207 bool is_bound (KeyboardKey const&, Operation) const;
208 std::string bound_name (KeyboardKey const&, Operation) const;
209 bool is_registered (Operation op, std::string const& action_name) const;
211 KeyboardKey get_binding_for_action (Glib::RefPtr<Gtk::Action>, Operation& op);
213 bool load (XMLNode const& node);
214 void load_operation (XMLNode const& node);
215 void save (XMLNode& root);
216 void save_as_html (std::ostream&, bool) const;
218 /* GTK has the following position a Gtk::Action:
220 * accel_path: <Actions>/GroupName/ActionName
223 * We want proper namespacing and we're not interested in
224 * the silly <Actions> "extra" namespace. So in Ardour:
226 * accel_path: <Actions>/GroupName/ActionName
227 * name: GroupName/ActionName
229 * This (static) method returns the "ardour" name for the action.
231 static std::string ardour_action_name (Glib::RefPtr<Gtk::Action>);
233 void set_action_map (ActionMap&);
235 /* used for editing bindings */
236 void get_all_actions (std::vector<std::string>& paths,
237 std::vector<std::string>& labels,
238 std::vector<std::string>& tooltips,
239 std::vector<std::string>& keys,
240 std::vector<Glib::RefPtr<Gtk::Action> >& actions);
242 /* all bindings currently in existence, as grouped into Bindings */
243 static void reset_bindings () { bindings.clear (); }
244 static std::list<Bindings*> bindings;
245 static Bindings* get_bindings (std::string const& name, ActionMap&);
246 static void associate_all ();
247 static void save_all_bindings_as_html (std::ostream&);
249 static PBD::Signal1<void,Bindings*> BindingsChanged;
253 ActionMap* _action_map;
254 KeybindingMap press_bindings;
255 KeybindingMap release_bindings;
257 typedef std::map<MouseButton,ActionInfo> MouseButtonBindingMap;
258 MouseButtonBindingMap button_press_bindings;
259 MouseButtonBindingMap button_release_bindings;
261 void push_to_gtk (KeyboardKey, Glib::RefPtr<Gtk::Action>);
263 KeybindingMap& get_keymap (Operation op);
264 const KeybindingMap& get_keymap (Operation op) const;
265 MouseButtonBindingMap& get_mousemap (Operation op);
270 std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k);
272 #endif /* __libgtkmm2ext_bindings_h__ */