merge with 2.0-ongoing @ rev 3147
[ardour.git] / gtk2_ardour / keyboard.h
1 /*
2     Copyright (C) 2001 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_keyboard_h__
21 #define __ardour_keyboard_h__
22
23 #include <vector>
24 #include <string>
25
26 #include <sigc++/signal.h>
27 #include <gtk/gtk.h>
28
29 #include <ardour/types.h>
30 #include <pbd/stateful.h>
31
32 #include "selection.h"
33
34 using std::vector;
35 using std::string;
36
37 class Keyboard : public sigc::trackable, PBD::Stateful
38 {
39   public:
40         Keyboard ();
41         ~Keyboard ();
42
43         XMLNode& get_state (void);
44         int set_state (const XMLNode&);
45
46         typedef vector<uint32_t> State;
47         typedef uint32_t ModifierMask;
48
49         static uint32_t PrimaryModifier;
50         static uint32_t SecondaryModifier;
51         static uint32_t TertiaryModifier;
52         static uint32_t Level4Modifier;
53         static uint32_t CopyModifier;
54         static uint32_t RangeSelectModifier;
55
56         static void set_primary_modifier (uint32_t newval) {
57                 set_modifier (newval, PrimaryModifier);
58         }
59         static void set_secondary_modifier (uint32_t newval) {
60                 set_modifier (newval, SecondaryModifier);
61         }
62         static void set_tertiary_modifier (uint32_t newval) {
63                 set_modifier (newval, TertiaryModifier);
64         }
65         static void set_level4_modifier (uint32_t newval) {
66                 set_modifier (newval, Level4Modifier);
67         }
68         static void set_copy_modifier (uint32_t newval) {
69                 set_modifier (newval, CopyModifier);
70         }
71         static void set_range_select_modifier (uint32_t newval) {
72                 set_modifier (newval, RangeSelectModifier);
73         }
74
75         bool key_is_down (uint32_t keyval);
76
77         static GdkModifierType RelevantModifierKeyMask;
78
79         static bool no_modifier_keys_pressed(GdkEventButton* ev) {
80                 return (ev->state & RelevantModifierKeyMask) == 0;
81         }
82
83         bool leave_window (GdkEventCrossing *ev, Gtk::Window*);
84         bool enter_window (GdkEventCrossing *ev, Gtk::Window*);
85
86         static bool modifier_state_contains (guint state, ModifierMask);
87         static bool modifier_state_equals   (guint state, ModifierMask);
88
89         static Selection::Operation selection_type (guint state);
90
91         static bool no_modifiers_active (guint state);
92
93         static void set_snap_modifier (guint);
94         static ModifierMask snap_modifier () { return ModifierMask (snap_mod); }
95
96         static guint edit_button() { return edit_but; }
97         static void set_edit_button (guint);
98         static guint edit_modifier() { return edit_mod; }
99         static void set_edit_modifier(guint);
100
101         static guint delete_button() { return delete_but; }
102         static void set_delete_button(guint);
103         static guint delete_modifier() { return delete_mod; }
104         static void set_delete_modifier(guint);
105
106         static bool is_edit_event (GdkEventButton*);
107         static bool is_delete_event (GdkEventButton*);
108         static bool is_context_menu_event (GdkEventButton*);
109
110         static Keyboard& the_keyboard() { return *_the_keyboard; }
111
112         static bool some_magic_widget_has_focus ();
113         static void magic_widget_grab_focus ();
114         static void magic_widget_drop_focus ();
115
116         static void setup_keybindings ();
117         static void save_keybindings ();
118         static bool load_keybindings (std::string path);
119         static void set_can_save_keybindings (bool yn);
120         static std::string current_binding_name () { return _current_binding_name; }
121         static std::map<std::string,std::string> binding_files;
122
123   private:
124         static Keyboard* _the_keyboard;
125
126         guint           snooper_id;
127         State           state;
128
129         static guint     edit_but;
130         static guint     edit_mod;
131         static guint     delete_but;
132         static guint     delete_mod;
133         static guint     snap_mod;
134         static Gtk::Window* current_window;
135         static std::string user_keybindings_path;
136         static bool can_save_keybindings;
137         static std::string _current_binding_name;
138
139         static gint _snooper (GtkWidget*, GdkEventKey*, gpointer);
140         gint snooper (GtkWidget*, GdkEventKey*);
141
142         static void set_modifier (uint32_t newval, uint32_t& variable);
143
144         static bool _some_magic_widget_has_focus;
145 };
146
147 #endif /* __ardour_keyboard_h__ */