2 Copyright (C) 2001 Paul Davis
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.
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.
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.
20 #include "pbd/convert.h"
21 #include "pbd/error.h"
22 #include "pbd/file_utils.h"
24 #include "ardour/filesystem_paths.h"
26 #include "ardour_ui.h"
27 #include "public_editor.h"
36 using namespace ARDOUR;
37 using Gtkmm2ext::Keyboard;
40 accel_map_changed (GtkAccelMap* /*map*/,
43 GdkModifierType /*mod*/,
46 ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
47 Keyboard::keybindings_changed ();
48 me->ui.setup_tooltips ();
52 ArdourKeyboard::setup_keybindings ()
54 using namespace ARDOUR_COMMAND_LINE;
55 string default_bindings = "mnemonic-us.bindings";
58 binding_files.clear ();
60 ARDOUR::find_bindings_files (binding_files);
62 /* set up the per-user bindings path */
64 string lowercase_program_name = downcase (PROGRAM_NAME);
66 user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + ".bindings");
68 if (Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
69 std::pair<string,string> newpair;
70 newpair.first = _("your own");
71 newpair.second = user_keybindings_path;
72 binding_files.insert (newpair);
75 /* check to see if they gave a style name ("SAE", "ergonomic") or
76 an actual filename (*.bindings)
79 if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
81 // just a style name - allow user to
82 // specify the layout type.
86 if ((layout = getenv ("ARDOUR_KEYBOARD_LAYOUT")) != 0 && layout[0] != '\0') {
88 /* user-specified keyboard layout */
90 keybindings_path += '-';
91 keybindings_path += layout;
95 /* default to US/ANSI - we have to pick something */
97 keybindings_path += "-us";
100 keybindings_path += ".bindings";
103 if (keybindings_path.empty()) {
105 /* no path or binding name given: check the user one first */
107 if (!Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
109 keybindings_path = "";
113 keybindings_path = user_keybindings_path;
117 /* if we still don't have a path at this point, use the default */
119 if (keybindings_path.empty()) {
120 keybindings_path = default_bindings;
125 if (!Glib::path_is_absolute (keybindings_path)) {
127 /* not absolute - look in the usual places */
128 std::string keybindings_file;
130 if ( ! find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
132 if (keybindings_path == default_bindings) {
133 error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
136 warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
139 keybindings_path = default_bindings;
146 keybindings_path = keybindings_file;
153 /* path is absolute already */
155 if (!Glib::file_test (keybindings_path, Glib::FILE_TEST_EXISTS)) {
156 if (keybindings_path == default_bindings) {
157 error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
160 keybindings_path = default_bindings;
169 load_keybindings (keybindings_path);
173 GtkAccelMap* accelmap = gtk_accel_map_get();
174 g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
178 ArdourKeyboard::selection_type (guint state)
180 /* note that there is no modifier for "Add" */
182 if (modifier_state_equals (state, RangeSelectModifier)) {
183 return Selection::Extend;
184 } else if (modifier_state_equals (state, PrimaryModifier)) {
185 return Selection::Toggle;
187 return Selection::Set;