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);
110 void set_bindings (Bindings*);
111 Bindings* bindings() const { return _bindings; }
113 typedef std::vector<Glib::RefPtr<Gtk::Action> > Actions;
114 void get_actions (Actions&);
116 static std::list<ActionMap*> action_maps;
118 /* used by control surface protocols and other UIs */
119 static void get_all_actions (std::vector<std::string>& paths,
120 std::vector<std::string>& labels,
121 std::vector<std::string>& tooltips,
122 std::vector<std::string>& keys,
123 std::vector<Glib::RefPtr<Gtk::Action> >& actions);
128 /* hash for faster lookup of actions by name */
130 typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
133 /* initialized to null; set after a Bindings object has ::associated()
134 * itself with this action map.
141 class LIBGTKMM2EXT_API Bindings {
149 ActionInfo (std::string const& name) : action_name (name) {}
150 ActionInfo (std::string const& name, std::string const& grp) : action_name (name), group_name (grp) {}
152 std::string action_name;
153 std::string group_name; /* may be empty */
154 Glib::RefPtr<Gtk::Action> action;
156 typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
158 Bindings (std::string const& name);
161 std::string const& name() const { return _name; }
167 bool empty_keys () const;
168 bool empty_mouse () const;
170 bool add (KeyboardKey, Operation, std::string const&, XMLProperty const*, bool can_save = false);
171 bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true);
172 bool remove (Operation, std::string const& action_name, bool can_save = false);
174 bool activate (KeyboardKey, Operation);
176 void add (MouseButton, Operation, std::string const&, XMLProperty const*);
177 void remove (MouseButton, Operation);
178 bool activate (MouseButton, Operation);
180 bool is_bound (KeyboardKey const&, Operation) const;
181 bool is_registered (Operation op, std::string const& action_name) const;
183 KeyboardKey get_binding_for_action (Glib::RefPtr<Gtk::Action>, Operation& op);
185 bool load (XMLNode const& node);
186 void load_operation (XMLNode const& node);
187 void save (XMLNode& root);
188 void save_as_html (std::ostream&) const;
190 /* GTK has the following position a Gtk::Action:
192 * accel_path: <Actions>/GroupName/ActionName
195 * We want proper namespacing and we're not interested in
196 * the silly <Actions> "extra" namespace. So in Ardour:
198 * accel_path: <Actions>/GroupName/ActionName
199 * name: GroupName/ActionName
201 * This (static) method returns the "ardour" name for the action.
203 static std::string ardour_action_name (Glib::RefPtr<Gtk::Action>);
205 void set_action_map (ActionMap&);
207 /* used for editing bindings */
208 void get_all_actions (std::vector<std::string>& paths,
209 std::vector<std::string>& labels,
210 std::vector<std::string>& tooltips,
211 std::vector<std::string>& keys,
212 std::vector<Glib::RefPtr<Gtk::Action> >& actions);
214 /* all bindings currently in existence, as grouped into Bindings */
215 static std::list<Bindings*> bindings;
216 static Bindings* get_bindings (std::string const& name, ActionMap&);
217 static void associate_all ();
218 static void save_all_bindings_as_html (std::ostream&);
220 static PBD::Signal1<void,Bindings*> BindingsChanged;
224 ActionMap* _action_map;
225 KeybindingMap press_bindings;
226 KeybindingMap release_bindings;
228 typedef std::map<MouseButton,ActionInfo> MouseButtonBindingMap;
229 MouseButtonBindingMap button_press_bindings;
230 MouseButtonBindingMap button_release_bindings;
232 void push_to_gtk (KeyboardKey, Glib::RefPtr<Gtk::Action>);
234 KeybindingMap& get_keymap (Operation op);
235 const KeybindingMap& get_keymap (Operation op) const;
236 MouseButtonBindingMap& get_mousemap (Operation op);
241 std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k);
243 #endif /* __libgtkmm2ext_bindings_h__ */