Tim Mayberry
8ddd12a60d
Windows headers define SearchPath which means we have to undefine it where necessary. This is a pain and can be tricksy, so I feel renaming the class slightly is the easiest solution.
191 lines
4.6 KiB
C++
191 lines
4.6 KiB
C++
/*
|
|
Copyright (C) 2001 Paul Davis
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
#include "pbd/error.h"
|
|
#include "pbd/file_utils.h"
|
|
|
|
#include "ardour/filesystem_paths.h"
|
|
|
|
#include "ardour_ui.h"
|
|
#include "keyboard.h"
|
|
#include "opts.h"
|
|
|
|
#include "i18n.h"
|
|
|
|
using namespace std;
|
|
using namespace Gtk;
|
|
using namespace PBD;
|
|
using namespace ARDOUR;
|
|
using Gtkmm2ext::Keyboard;
|
|
|
|
static void
|
|
accel_map_changed (GtkAccelMap* /*map*/,
|
|
gchar* /*path*/,
|
|
guint /*key*/,
|
|
GdkModifierType /*mod*/,
|
|
gpointer keyboard)
|
|
{
|
|
ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
|
|
Keyboard::keybindings_changed ();
|
|
me->ui.setup_tooltips ();
|
|
}
|
|
|
|
void
|
|
ArdourKeyboard::setup_keybindings ()
|
|
{
|
|
using namespace ARDOUR_COMMAND_LINE;
|
|
string default_bindings = "mnemonic-us.bindings";
|
|
vector<string> strs;
|
|
|
|
binding_files.clear ();
|
|
|
|
ARDOUR::find_bindings_files (binding_files);
|
|
|
|
/* set up the per-user bindings path */
|
|
|
|
user_keybindings_path = Glib::build_filename (user_config_directory(), "ardour.bindings");
|
|
|
|
if (Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
|
|
std::pair<string,string> newpair;
|
|
newpair.first = _("your own");
|
|
newpair.second = user_keybindings_path;
|
|
binding_files.insert (newpair);
|
|
}
|
|
|
|
/* check to see if they gave a style name ("SAE", "ergonomic") or
|
|
an actual filename (*.bindings)
|
|
*/
|
|
|
|
if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
|
|
|
|
// just a style name - allow user to
|
|
// specify the layout type.
|
|
|
|
char* layout;
|
|
|
|
if ((layout = getenv ("ARDOUR_KEYBOARD_LAYOUT")) != 0 && layout[0] != '\0') {
|
|
|
|
/* user-specified keyboard layout */
|
|
|
|
keybindings_path += '-';
|
|
keybindings_path += layout;
|
|
|
|
} else {
|
|
|
|
/* default to US/ANSI - we have to pick something */
|
|
|
|
keybindings_path += "-us";
|
|
}
|
|
|
|
keybindings_path += ".bindings";
|
|
}
|
|
|
|
if (keybindings_path.empty()) {
|
|
|
|
/* no path or binding name given: check the user one first */
|
|
|
|
if (!Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
|
|
|
|
keybindings_path = "";
|
|
|
|
} else {
|
|
|
|
keybindings_path = user_keybindings_path;
|
|
}
|
|
}
|
|
|
|
/* if we still don't have a path at this point, use the default */
|
|
|
|
if (keybindings_path.empty()) {
|
|
keybindings_path = default_bindings;
|
|
}
|
|
|
|
while (true) {
|
|
|
|
if (!Glib::path_is_absolute (keybindings_path)) {
|
|
|
|
/* not absolute - look in the usual places */
|
|
std::string keybindings_file;
|
|
|
|
if ( ! find_file_in_search_path (ardour_config_search_path(), keybindings_path, keybindings_file)) {
|
|
|
|
if (keybindings_path == default_bindings) {
|
|
error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
|
|
return;
|
|
} else {
|
|
warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
|
|
keybindings_path)
|
|
<< endmsg;
|
|
keybindings_path = default_bindings;
|
|
}
|
|
|
|
} else {
|
|
|
|
/* use it */
|
|
|
|
keybindings_path = keybindings_file;
|
|
break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* path is absolute already */
|
|
|
|
if (!Glib::file_test (keybindings_path, Glib::FILE_TEST_EXISTS)) {
|
|
if (keybindings_path == default_bindings) {
|
|
error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
|
|
return;
|
|
} else {
|
|
warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
|
|
keybindings_path)
|
|
<< endmsg;
|
|
keybindings_path = default_bindings;
|
|
}
|
|
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
load_keybindings (keybindings_path);
|
|
|
|
/* catch changes */
|
|
|
|
GtkAccelMap* accelmap = gtk_accel_map_get();
|
|
g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
|
|
}
|
|
|
|
Selection::Operation
|
|
ArdourKeyboard::selection_type (guint state)
|
|
{
|
|
/* note that there is no modifier for "Add" */
|
|
|
|
if (modifier_state_equals (state, RangeSelectModifier)) {
|
|
return Selection::Extend;
|
|
} else if (modifier_state_equals (state, PrimaryModifier)) {
|
|
return Selection::Toggle;
|
|
} else {
|
|
return Selection::Set;
|
|
}
|
|
}
|
|
|
|
|