X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fgtkmm2ext%2Fkeyboard.h;h=316fdd7fe374f26f9967ec2dc90f98df4d3990c5;hb=e8903a7590caaa46498d3e53c9d7df63edb24090;hp=2123e6ff6969477b7035b985d7ee97d48477e1c3;hpb=23e7cf10191270d70357ccf0ed9294f020c7b7ab;p=ardour.git diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h index 2123e6ff69..316fdd7fe3 100644 --- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h +++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h @@ -24,11 +24,11 @@ #include #include -#include #include #include #include "pbd/stateful.h" +#include "pbd/signals.h" #include "gtkmm2ext/visibility.h" @@ -38,6 +38,9 @@ namespace Gtk { namespace Gtkmm2ext { +class Bindings; +class ActionMap; + class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful { public: @@ -48,6 +51,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful int set_state (const XMLNode&, int version); virtual void setup_keybindings () = 0; + static void reset_relevant_modifier_key_mask (); typedef std::vector State; typedef uint32_t ModifierMask; @@ -70,8 +74,11 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful static const char* secondary_modifier_name (); static const char* tertiary_modifier_name (); static const char* level4_modifier_name (); - static const char* copy_modifier_name (); - static const char* rangeselect_modifier_name (); + + static const char* primary_modifier_short_name (); + static const char* secondary_modifier_short_name (); + static const char* tertiary_modifier_short_name (); + static const char* level4_modifier_short_name (); static void set_primary_modifier (uint32_t newval) { set_modifier (newval, PrimaryModifier); @@ -106,6 +113,8 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful bool leave_window (GdkEventCrossing *ev, Gtk::Window*); bool enter_window (GdkEventCrossing *ev, Gtk::Window*); + bool focus_in_window (GdkEventFocus *ev, Gtk::Window*); + bool focus_out_window (GdkEventFocus *ev, Gtk::Window*); static bool modifier_state_contains (guint state, ModifierMask); static bool modifier_state_equals (guint state, ModifierMask); @@ -113,13 +122,22 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful static bool no_modifiers_active (guint state); static void set_snap_modifier (guint); - /** @return Modifier mask to temporarily toggle grid setting; with this modifier * - magnetic or normal grid should become no grid and * - no grid should become normal grid */ static ModifierMask snap_modifier () { return ModifierMask (snap_mod); } + static void set_snap_delta_modifier (guint); + /** @return Modifier mask to temporarily toggle between relative and absolute grid setting. + * Absolute grid is for aligning objects with the grid lines. + * Relative grid is for maintaining an initial position relative to the grid lines. + * With this modifier: + * - magnetic or normal grid should snap relative to an initial grid offset + * - no grid should snap relative to the grid. + */ + static ModifierMask snap_delta_modifier () { return ModifierMask (snap_delta_mod); } + static guint edit_button() { return edit_but; } static void set_edit_button (guint); static guint edit_modifier() { return edit_mod; } @@ -134,7 +152,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful static void set_insert_note_button (guint); static guint insert_note_modifier() { return insert_note_mod; } static void set_insert_note_modifier(guint); - + static bool is_edit_event (GdkEventButton*); static bool is_delete_event (GdkEventButton*); static bool is_insert_note_event (GdkEventButton*); @@ -146,27 +164,27 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful static bool some_magic_widget_has_focus (); static void magic_widget_grab_focus (); static void magic_widget_drop_focus (); + static Gtk::Window* get_current_window () { return current_window; }; static void close_current_dialog (); static void keybindings_changed (); static void save_keybindings (); - static bool load_keybindings (std::string path); static void set_can_save_keybindings (bool yn); static std::string current_binding_name () { return _current_binding_name; } static std::map binding_files; - struct AccelKeyLess { - bool operator() (const Gtk::AccelKey a, const Gtk::AccelKey b) const { - if (a.get_key() != b.get_key()) { - return a.get_key() < b.get_key(); - } else { - return a.get_mod() < b.get_mod(); - } - } - }; + static bool catch_user_event_for_pre_dialog_focus (GdkEvent* ev, Gtk::Window* w); + + static bool load_keybindings (std::string const& path); + static void save_keybindings (std::string const& path); + + static std::string binding_filename_suffix; + + int reset_bindings (); sigc::signal0 ZoomVerticalModifierReleased; + static sigc::signal0 RelevantModifierKeysChanged; protected: static Keyboard* _the_keyboard; @@ -181,6 +199,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful static guint insert_note_but; static guint insert_note_mod; static guint snap_mod; + static guint snap_delta_mod; static guint button2_modifiers; static Gtk::Window* current_window; static std::string user_keybindings_path; @@ -190,14 +209,17 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful typedef std::pair two_strings; - static std::map release_keys; - static gint _snooper (GtkWidget*, GdkEventKey*, gpointer); gint snooper (GtkWidget*, GdkEventKey*); static void set_modifier (uint32_t newval, uint32_t& variable); static bool _some_magic_widget_has_focus; + + static Gtk::Window* pre_dialog_active_window; + + static int read_keybindings (std::string const& path); + static int store_keybindings (std::string const& path); }; } /* namespace */