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/error.h"
21 #include "pbd/file_utils.h"
23 #include "ardour/filesystem_paths.h"
25 #include "ardour_ui.h"
34 using namespace ARDOUR
;
35 using Gtkmm2ext::Keyboard
;
38 accel_map_changed (GtkAccelMap
* /*map*/,
41 GdkModifierType
/*mod*/,
44 ArdourKeyboard
* me
= (ArdourKeyboard
*)keyboard
;
45 Keyboard::keybindings_changed ();
46 me
->ui
.setup_tooltips ();
50 ArdourKeyboard::setup_keybindings ()
52 using namespace ARDOUR_COMMAND_LINE
;
53 string default_bindings
= "mnemonic-us.bindings";
56 binding_files
.clear ();
58 ARDOUR::find_bindings_files (binding_files
);
60 /* set up the per-user bindings path */
62 strs
.push_back (Glib::get_home_dir());
63 strs
.push_back (".ardour3");
64 strs
.push_back ("ardour.bindings");
66 user_keybindings_path
= Glib::build_filename (strs
);
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 sys::path keybindings_file
;
130 SearchPath spath
= ardour_search_path() + user_config_directory() + system_config_search_path();
132 if ( ! find_file_in_search_path (spath
, keybindings_path
, keybindings_file
)) {
134 if (keybindings_path
== default_bindings
) {
135 error
<< string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME
) << endmsg
;
138 warning
<< string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
141 keybindings_path
= default_bindings
;
148 keybindings_path
= keybindings_file
.to_string();
155 /* path is absolute already */
157 if (!Glib::file_test (keybindings_path
, Glib::FILE_TEST_EXISTS
)) {
158 if (keybindings_path
== default_bindings
) {
159 error
<< string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME
) << endmsg
;
162 warning
<< string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
165 keybindings_path
= default_bindings
;
174 load_keybindings (keybindings_path
);
178 GtkAccelMap
* accelmap
= gtk_accel_map_get();
179 g_signal_connect (accelmap
, "changed", (GCallback
) accel_map_changed
, this);
183 ArdourKeyboard::selection_type (guint state
)
185 /* note that there is no modifier for "Add" */
187 if (modifier_state_equals (state
, RangeSelectModifier
)) {
188 return Selection::Extend
;
189 } else if (modifier_state_equals (state
, PrimaryModifier
)) {
190 return Selection::Toggle
;
192 return Selection::Set
;