ardour
keyboard.cc
Go to the documentation of this file.
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 #include "pbd/convert.h"
21 #include "pbd/error.h"
22 #include "pbd/file_utils.h"
23 
25 
26 #include "ardour_ui.h"
27 #include "public_editor.h"
28 #include "keyboard.h"
29 #include "opts.h"
30 
31 #include "i18n.h"
32 
33 using namespace std;
34 using namespace Gtk;
35 using namespace PBD;
36 using namespace ARDOUR;
38 
39 static void
40 accel_map_changed (GtkAccelMap* /*map*/,
41  gchar* /*path*/,
42  guint /*key*/,
43  GdkModifierType /*mod*/,
44  gpointer keyboard)
45 {
46  ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
47  Keyboard::keybindings_changed ();
48  me->ui.setup_tooltips ();
49 }
50 
51 void
53 {
54  using namespace ARDOUR_COMMAND_LINE;
55  string default_bindings = "mnemonic-us.bindings";
56  vector<string> strs;
57 
58  binding_files.clear ();
59 
60  ARDOUR::find_bindings_files (binding_files);
61 
62  /* set up the per-user bindings path */
63 
64  string lowercase_program_name = downcase (PROGRAM_NAME);
65 
66  user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + ".bindings");
67 
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);
73  }
74 
75  /* check to see if they gave a style name ("SAE", "ergonomic") or
76  an actual filename (*.bindings)
77  */
78 
79  if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
80 
81  // just a style name - allow user to
82  // specify the layout type.
83 
84  char* layout;
85 
86  if ((layout = getenv ("ARDOUR_KEYBOARD_LAYOUT")) != 0 && layout[0] != '\0') {
87 
88  /* user-specified keyboard layout */
89 
90  keybindings_path += '-';
91  keybindings_path += layout;
92 
93  } else {
94 
95  /* default to US/ANSI - we have to pick something */
96 
97  keybindings_path += "-us";
98  }
99 
100  keybindings_path += ".bindings";
101  }
102 
103  if (keybindings_path.empty()) {
104 
105  /* no path or binding name given: check the user one first */
106 
107  if (!Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
108 
109  keybindings_path = "";
110 
111  } else {
112 
113  keybindings_path = user_keybindings_path;
114  }
115  }
116 
117  /* if we still don't have a path at this point, use the default */
118 
119  if (keybindings_path.empty()) {
120  keybindings_path = default_bindings;
121  }
122 
123  while (true) {
124 
125  if (!Glib::path_is_absolute (keybindings_path)) {
126 
127  /* not absolute - look in the usual places */
128  std::string keybindings_file;
129 
130  if ( ! find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
131 
132  if (keybindings_path == default_bindings) {
133  error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
134  return;
135  } else {
136  warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
138  << endmsg;
139  keybindings_path = default_bindings;
140  }
141 
142  } else {
143 
144  /* use it */
145 
146  keybindings_path = keybindings_file;
147  break;
148 
149  }
150 
151  } else {
152 
153  /* path is absolute already */
154 
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;
158  return;
159  } else {
160  keybindings_path = default_bindings;
161  }
162 
163  } else {
164  break;
165  }
166  }
167  }
168 
169  load_keybindings (keybindings_path);
170 
171  /* catch changes */
172 
173  GtkAccelMap* accelmap = gtk_accel_map_get();
174  g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
175 }
176 
179 {
180  /* note that there is no modifier for "Add" */
181 
182  if (modifier_state_equals (state, RangeSelectModifier)) {
183  return Selection::Extend;
184  } else if (modifier_state_equals (state, PrimaryModifier)) {
185  return Selection::Toggle;
186  } else {
187  return Selection::Set;
188  }
189 }
190 
191 
LIBARDOUR_API void find_bindings_files(std::map< std::string, std::string > &)
Definition: ardour_ui.h:130
Definition: Beats.hpp:239
LIBPBD_API Transmitter error
LIBPBD_API Transmitter warning
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
string downcase(const string &str)
Definition: convert.cc:58
void setup_tooltips()
Definition: ardour_ui2.cc:126
bool find_file(const Searchpath &search_path, const string &filename, std::string &result)
Definition: file_utils.cc:187
ARDOUR_UI & ui
Definition: keyboard.h:39
#define _(Text)
Definition: i18n.h:11
LIBARDOUR_API std::string user_config_directory(int version=-1)
LIBGTKMM2EXT_API uint64_t Keyboard
Definition: debug.cc:23
Definition: amp.h:29
std::string keybindings_path
Definition: opts.cc:45
static void accel_map_changed(GtkAccelMap *, gchar *, guint, GdkModifierType, gpointer keyboard)
Definition: keyboard.cc:40
LIBARDOUR_API PBD::Searchpath ardour_config_search_path()
static Selection::Operation selection_type(guint state)
Definition: keyboard.cc:178
Definition: debug.h:30
void setup_keybindings()
Definition: keyboard.cc:52
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208