Ardour  9.0-pre0-2084-g1e6d75d781
libs/gtkmm2ext/gtkmm2ext/keyboard.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2001-2016 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2012 Carl Hetherington <carl@carlh.net>
4  * Copyright (C) 2013 Colin Fletcher <colin.m.fletcher@googlemail.com>
5  * Copyright (C) 2015-2016 Nick Mainsbridge <mainsbridge@gmail.com>
6  * Copyright (C) 2015 Robin Gareus <robin@gareus.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef __libgtkmm2ext_keyboard_h__
24 #define __libgtkmm2ext_keyboard_h__
25 
26 #include <map>
27 #include <string>
28 #include <vector>
29 
30 #include <ytk/ytk.h>
31 #include <ytkmm/accelkey.h>
32 
33 #include "pbd/signals.h"
34 #include "pbd/stateful.h"
35 
36 #include "gtkmm2ext/visibility.h"
37 
38 namespace Gtk
39 {
40  class Window;
41 }
42 
43 namespace Gtkmm2ext
44 {
45 class Bindings;
46 class ActionMap;
47 
48 class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
49 {
50 public:
53 
54  XMLNode& get_state () const;
55  int set_state (const XMLNode&, int version);
56 
57  virtual void setup_keybindings () = 0;
59 
60  typedef std::vector<uint32_t> State;
61  typedef uint32_t ModifierMask;
62 
63  static const uint32_t PrimaryModifier;
64  static const uint32_t SecondaryModifier;
65  static const uint32_t TertiaryModifier;
66  static const uint32_t Level4Modifier;
67  static const uint32_t CapsLockModifier;
68 
69  static uint32_t CopyModifier;
70  static uint32_t RangeSelectModifier;
71  static uint32_t GainFineScaleModifier;
72  static uint32_t GainExtraFineScaleModifier;
73 
74  // Modifiers for scroll wheel
75  static uint32_t ScrollZoomVerticalModifier;
77  static uint32_t ScrollHorizontalModifier;
78 
79  static const char* primary_modifier_name ();
80  static const char* secondary_modifier_name ();
81  static const char* tertiary_modifier_name ();
82  static const char* level4_modifier_name ();
83  static const char* caps_lock_modifier_name ();
84 
85  static const char* primary_modifier_short_name ();
86  static const char* secondary_modifier_short_name ();
87  static const char* tertiary_modifier_short_name ();
88  static const char* level4_modifier_short_name ();
89  static const char* caps_lock_modifier_short_name ();
90 
91  static const char* button2_name ();
92  static const char* momentary_push_name ();
93  static const char* group_override_event_name ();
94 
95  static std::string format_modifier (uint32_t);
96 
97  bool key_is_down (uint32_t keyval);
98  guint modifier_state ();
99 
101 
103  {
104  return (ev->state & RelevantModifierKeyMask) == 0;
105  }
106 
108  {
109  return (ev->state & RelevantModifierKeyMask) == 0;
110  }
111 
116 
117  static bool modifier_state_contains (guint state, ModifierMask);
118  static bool modifier_state_equals (guint state, ModifierMask);
119 
120  static bool no_modifiers_active (guint state);
121 
122  static void set_copy_modifier (uint32_t newval)
123  {
124  set_modifier (newval, CopyModifier);
125  }
126  static void set_range_select_modifier (uint32_t newval)
127  {
128  set_modifier (newval, RangeSelectModifier);
129  }
130 
131  static void set_snap_modifier (guint);
132  static void set_snap_delta_modifier (guint);
133  static void set_edit_button (guint);
134  static void set_edit_modifier (guint);
135  static void set_delete_button (guint);
136  static void set_delete_modifier (guint);
137  static void set_insert_note_button (guint);
138  static void set_insert_note_modifier (guint);
139 
145  {
146  return ModifierMask (snap_mod);
147  }
148 
157  {
158  return ModifierMask (snap_delta_mod);
159  }
160 
161  static guint edit_button ()
162  {
163  return edit_but;
164  }
165  static guint edit_modifier ()
166  {
167  return edit_mod;
168  }
169  static guint delete_button ()
170  {
171  return delete_but;
172  }
173  static guint delete_modifier ()
174  {
175  return delete_mod;
176  }
177  static guint insert_note_button ()
178  {
179  return insert_note_but;
180  }
181  static guint insert_note_modifier ()
182  {
183  return insert_note_mod;
184  }
185  static guint button2_modifier ()
186  {
187  return button2_modifiers;
188  }
189  static guint momentary_push_modifier ()
190  {
191  return momentary_push_modifiers;
192  }
193  static guint group_override_modifier ()
194  {
195  return group_override_modifiers;
196  }
197 
205 
207  {
208  return *_the_keyboard;
209  }
210 
212  static void magic_widget_grab_focus ();
213  static void magic_widget_drop_focus ();
215  {
216  return current_window;
217  };
218 
219  static bool close_current_dialog ();
220 
221  static void keybindings_changed ();
222  static void save_keybindings ();
223  static void set_can_save_keybindings (bool yn);
224  static std::string current_binding_name ()
225  {
226  return _current_binding_name;
227  }
228  static std::map<std::string, std::string> binding_files;
229 
231 
232  static bool load_keybindings (std::string const& path);
233  static void save_keybindings (std::string const& path);
234 
235  static std::string binding_filename_suffix;
236  static const int close_window_key;
237  static guint close_window_modifier;
238 
240 
241  sigc::signal0<void> ZoomVerticalModifierReleased;
242  static sigc::signal0<void> RelevantModifierKeysChanged;
243  static sigc::signal1<void, Gtk::Window*> HideMightMeanQuit;
244 
245 protected:
247 
248  guint snooper_id;
250 
251  static guint edit_but;
252  static guint edit_mod;
253  static guint delete_but;
254  static guint delete_mod;
255  static guint insert_note_but;
256  static guint insert_note_mod;
257  static guint snap_mod;
258  static guint snap_delta_mod;
259  static guint button2_modifiers;
263  static std::string user_keybindings_path;
264  static bool can_save_keybindings;
266  static std::string _current_binding_name;
267 
268  typedef std::pair<std::string, std::string> two_strings;
269 
270  static gint _snooper (GtkWidget*, GdkEventKey*, gpointer);
272 
273  static void set_modifier (uint32_t newval, uint32_t& variable);
274 
276 
278 
279  static int read_keybindings (std::string const& path);
280  static int store_keybindings (std::string const& path);
281 };
282 
283 } // namespace Gtkmm2ext
284 
285 #endif /* __libgtkmm2ext_keyboard_h__ */
int set_state(const XMLNode &, int version)
static void set_insert_note_modifier(guint)
XMLNode & get_state() const
static bool no_modifier_keys_pressed(GdkEventButton *ev)
static void reset_relevant_modifier_key_mask()
static void magic_widget_grab_focus()
static int store_keybindings(std::string const &path)
bool focus_out_window(GdkEventFocus *ev, Gtk::Window *)
static bool close_current_dialog()
static void set_edit_modifier(guint)
static sigc::signal1< void, Gtk::Window * > HideMightMeanQuit
static const uint32_t TertiaryModifier
bool leave_window(GdkEventCrossing *ev, Gtk::Window *)
static void keybindings_changed()
static void set_snap_delta_modifier(guint)
static const uint32_t CapsLockModifier
static std::map< std::string, std::string > binding_files
static std::string format_modifier(uint32_t)
static bool is_insert_note_event(GdkEventButton *)
static void set_delete_modifier(guint)
static const char * level4_modifier_short_name()
static Gtk::Window * get_current_window()
static const char * caps_lock_modifier_short_name()
static void set_range_select_modifier(uint32_t newval)
static const char * group_override_event_name()
static bool no_modifier_keys_pressed(GdkEventKey *ev)
bool enter_window(GdkEventCrossing *ev, Gtk::Window *)
static const char * tertiary_modifier_name()
static gint _snooper(GtkWidget *, GdkEventKey *, gpointer)
static bool catch_user_event_for_pre_dialog_focus(GdkEvent *ev, Gtk::Window *w)
static void set_edit_button(guint)
static void set_insert_note_button(guint)
static bool is_group_override_event(GdkEventButton *)
bool key_is_down(uint32_t keyval)
static sigc::signal0< void > RelevantModifierKeysChanged
static bool some_magic_widget_has_focus()
static const char * momentary_push_name()
static bool no_modifiers_active(guint state)
static ModifierMask snap_delta_modifier()
static bool is_edit_event(GdkEventButton *)
static void set_modifier(uint32_t newval, uint32_t &variable)
static void set_snap_modifier(guint)
std::pair< std::string, std::string > two_strings
static void save_keybindings(std::string const &path)
static const char * tertiary_modifier_short_name()
static void set_copy_modifier(uint32_t newval)
static const char * secondary_modifier_short_name()
static void save_keybindings()
bool focus_in_window(GdkEventFocus *ev, Gtk::Window *)
static bool modifier_state_equals(guint state, ModifierMask)
sigc::signal0< void > ZoomVerticalModifierReleased
static void set_can_save_keybindings(bool yn)
static const char * primary_modifier_short_name()
static int read_keybindings(std::string const &path)
static void set_delete_button(guint)
static const char * button2_name()
virtual void setup_keybindings()=0
static const char * caps_lock_modifier_name()
static GdkModifierType RelevantModifierKeyMask
static bool modifier_state_contains(guint state, ModifierMask)
static bool is_context_menu_event(GdkEventButton *)
static Gtk::Window * pre_dialog_active_window
static const char * level4_modifier_name()
static void magic_widget_drop_focus()
static bool is_momentary_push_event(GdkEventButton *)
static const char * secondary_modifier_name()
static bool load_keybindings(std::string const &path)
static const uint32_t SecondaryModifier
static bool is_button2_event(GdkEventButton *)
gint snooper(GtkWidget *, GdkEventKey *)
static bool is_delete_event(GdkEventButton *)
static const char * primary_modifier_name()
Definition: Window.h:41
Definition: xml++.h:114
GdkModifierType
Definition: gdktypes.h:127
#define LIBGTKMM2EXT_API
Definition: ardour_ui.h:192
DebugBits Bindings
guint state
Definition: gdkevents.h:373