Use correct default value for MIDI faders, and put the
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / bindings.h
index 6959dc82e191d14cb8da2daf8fe7bc25117bbe84..36da0b6075b3b4d8c45fd3e28048ec3873a5bc6e 100644 (file)
@@ -9,28 +9,21 @@
 #include <gtkmm/radioaction.h>
 #include <gtkmm/toggleaction.h>
 
+class XMLNode;
+
 namespace Gtkmm2ext {
 
 class KeyboardKey
 {
   public:
-        enum Operation { 
-                Press,
-                Release
-        };
-
         KeyboardKey () {
                 _val = GDK_VoidSymbol;
         }
         
-        KeyboardKey (int state, int keycode) {
-                _val = state;
-                _val <<= 32;
-                _val |= keycode;
-        };
+        KeyboardKey (uint32_t state, uint32_t keycode);
         
-        int state() const { return _val >> 32; }
-        int key() const { return _val & 0xffff; }
+        uint32_t state() const { return _val >> 32; }
+        uint32_t key() const { return _val & 0xffff; }
         
         bool operator<(const KeyboardKey& other) const {
                 return _val < other._val;
@@ -42,9 +35,38 @@ class KeyboardKey
 
         std::string name() const;
         static bool make_key (const std::string&, KeyboardKey&);
-        
+
+  private:
+        uint64_t _val;
+};
+
+class MouseButton {
+  public:
+        MouseButton () {
+                _val = ~0ULL;
+        }
+
+        MouseButton (uint32_t state, uint32_t button_number);
+        uint32_t state() const { return _val >> 32; }
+        uint32_t button() const { return _val & 0xffff; }
+
+        bool operator<(const MouseButton& other) const {
+                return _val < other._val;
+        }
+
+        bool operator==(const MouseButton& other) const {
+                return _val == other._val;
+        }
+
+        std::string name() const;
+        static bool make_button (const std::string&, MouseButton&);
+        static void set_ignored_state (int mask) {
+                _ignored_state = mask;
+        }
+
   private:
         uint64_t _val;
+        static uint32_t _ignored_state;
 };
 
 class ActionMap {
@@ -70,24 +92,46 @@ class ActionMap {
 
 class Bindings {
   public:
+        enum Operation { 
+                Press,
+                Release
+        };
+        
         Bindings();
         ~Bindings ();
 
-        void add (KeyboardKey, KeyboardKey::Operation, Glib::RefPtr<Gtk::Action>);
-        void remove (KeyboardKey, KeyboardKey::Operation);
-        bool activate (KeyboardKey, KeyboardKey::Operation);
+        void add (KeyboardKey, Operation, Glib::RefPtr<Gtk::Action>);
+        void remove (KeyboardKey, Operation);
+        bool activate (KeyboardKey, Operation);
+
+        void add (MouseButton, Operation, Glib::RefPtr<Gtk::Action>);
+        void remove (MouseButton, Operation);
+        bool activate (MouseButton, Operation);
 
         bool load (const std::string& path);
+        void load (const XMLNode& node);
         bool save (const std::string& path);
+        void save (XMLNode& root);
         
         void set_action_map (ActionMap&);
 
+        static void set_ignored_state (int mask) {
+                _ignored_state = mask;
+        }
+        static uint32_t ignored_state() { return _ignored_state; }
+
   private:
         typedef std::map<KeyboardKey,Glib::RefPtr<Gtk::Action> > KeybindingMap;
+
         KeybindingMap press_bindings;
         KeybindingMap release_bindings;
 
+        typedef std::map<MouseButton,Glib::RefPtr<Gtk::Action> > MouseButtonBindingMap;
+        MouseButtonBindingMap button_press_bindings;
+        MouseButtonBindingMap button_release_bindings;
+
         ActionMap* action_map;
+        static uint32_t _ignored_state;
 };
 
 } // namespace