/*
- Copyright (C) 2001 Paul Davis
+ 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
guint Keyboard::TertiaryModifier = GDK_SHIFT_MASK; // Shift
guint Keyboard::Level4Modifier = GDK_CONTROL_MASK; // Control
guint Keyboard::CopyModifier = GDK_MOD1_MASK; // Alt/Option
-guint Keyboard::RangeSelectModifier = GDK_SHIFT_MASK;
+guint Keyboard::RangeSelectModifier = GDK_SHIFT_MASK;
guint Keyboard::button2_modifiers = Keyboard::SecondaryModifier|Keyboard::Level4Modifier;
#else
guint Keyboard::PrimaryModifier = GDK_CONTROL_MASK; // Control
guint Keyboard::SecondaryModifier = GDK_MOD1_MASK; // Alt/Option
guint Keyboard::TertiaryModifier = GDK_SHIFT_MASK; // Shift
guint Keyboard::Level4Modifier = GDK_MOD4_MASK; // Mod4/Windows
-guint Keyboard::CopyModifier = GDK_CONTROL_MASK;
-guint Keyboard::RangeSelectModifier = GDK_SHIFT_MASK;
+guint Keyboard::CopyModifier = GDK_CONTROL_MASK;
+guint Keyboard::RangeSelectModifier = GDK_SHIFT_MASK;
guint Keyboard::button2_modifiers = 0; /* not used */
#endif
GdkModifierType Keyboard::RelevantModifierKeyMask;
void
-Keyboard::magic_widget_grab_focus ()
+Keyboard::magic_widget_grab_focus ()
{
_some_magic_widget_has_focus = true;
}
snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this);
XMLNode* node = ARDOUR_UI::instance()->keyboard_settings();
- set_state (*node);
+ set_state (*node, Stateful::loading_state_version);
}
Keyboard::~Keyboard ()
gtk_key_snooper_remove (snooper_id);
}
-XMLNode&
+XMLNode&
Keyboard::get_state (void)
{
XMLNode* node = new XMLNode ("Keyboard");
return *node;
}
-int
-Keyboard::set_state (const XMLNode& node)
+int
+Keyboard::set_state (const XMLNode& node, int /*version*/)
{
const XMLProperty* prop;
if ((prop = node.property ("edit-button")) != 0) {
sscanf (prop->value().c_str(), "%d", &edit_but);
- }
+ }
if ((prop = node.property ("edit-modifier")) != 0) {
sscanf (prop->value().c_str(), "%d", &edit_mod);
- }
+ }
if ((prop = node.property ("delete-button")) != 0) {
sscanf (prop->value().c_str(), "%d", &delete_but);
- }
+ }
if ((prop = node.property ("delete-modifier")) != 0) {
sscanf (prop->value().c_str(), "%d", &delete_mod);
- }
+ }
if ((prop = node.property ("snap-modifier")) != 0) {
sscanf (prop->value().c_str(), "%d", &snap_mod);
- }
+ }
return 0;
}
bool ret = false;
#if 0
- cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
+ cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
<< " state " << std::hex << event->state << std::dec
<< endl;
#endif
#if KBD_DEBUG
if (debug_keyboard) {
- cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
+ cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
<< endl;
}
#endif
} else {
keyval = event->keyval;
}
-
+
if (event->type == GDK_KEY_PRESS) {
if (find (state.begin(), state.end(), keyval) == state.end()) {
for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
const AccelKey& ak (k->first);
-
- if (keyval == ak.get_key() && (Gdk::ModifierType)(event->state | Gdk::RELEASE_MASK) == ak.get_mod()) {
+
+ if (keyval == ak.get_key() && (Gdk::ModifierType)((event->state & Keyboard::RelevantModifierKeyMask) | Gdk::RELEASE_MASK) == ak.get_mod()) {
+ cerr << "Suppress auto repeat\n";
ret = true;
break;
}
} else if (event->type == GDK_KEY_RELEASE) {
State::iterator i;
-
+
if ((i = find (state.begin(), state.end(), keyval)) != state.end()) {
state.erase (i);
sort (state.begin(), state.end());
- }
+ }
for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
const AccelKey& ak (k->first);
two_strings ts (k->second);
- if (keyval == ak.get_key() && (Gdk::ModifierType)(event->state | Gdk::RELEASE_MASK) == ak.get_mod()) {
+ if (keyval == ak.get_key() && (Gdk::ModifierType)((event->state & Keyboard::RelevantModifierKeyMask) | Gdk::RELEASE_MASK) == ak.get_mod()) {
Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (ts.first.c_str(), ts.second.c_str());
if (act) {
act->activate();
+ cerr << "use repeat, suppress other\n";
ret = true;
}
break;
}
bool
-Keyboard::enter_window (GdkEventCrossing *ev, Gtk::Window* win)
+Keyboard::enter_window (GdkEventCrossing *, Gtk::Window* win)
{
current_window = win;
return false;
}
bool
-Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* win)
+Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* /*win*/)
{
if (ev) {
switch (ev->detail) {
cerr << "INFERIOR crossing ... out\n";
}
break;
-
+
case GDK_NOTIFY_VIRTUAL:
if (debug_keyboard) {
cerr << "VIRTUAL crossing ... out\n";
}
/* fallthru */
-
+
default:
if (debug_keyboard) {
cerr << "REAL CROSSING ... out\n";
bool
Keyboard::is_edit_event (GdkEventButton *ev)
{
- return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
- (ev->button == Keyboard::edit_button()) &&
+ return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
+ (ev->button == Keyboard::edit_button()) &&
((ev->state & RelevantModifierKeyMask) == Keyboard::edit_modifier());
}
Keyboard::is_button2_event (GdkEventButton* ev)
{
#ifdef GTKOSX
- return (ev->button == 2) ||
- ((ev->button == 1) &&
+ return (ev->button == 2) ||
+ ((ev->button == 1) &&
((ev->state & Keyboard::button2_modifiers) == Keyboard::button2_modifiers));
#else
return ev->button == 2;
-#endif
+#endif
}
bool
Keyboard::is_delete_event (GdkEventButton *ev)
{
- return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
- (ev->button == Keyboard::delete_button()) &&
+ return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
+ (ev->button == Keyboard::delete_button()) &&
((ev->state & RelevantModifierKeyMask) == Keyboard::delete_modifier());
}
bool
Keyboard::is_context_menu_event (GdkEventButton *ev)
{
- return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
- (ev->button == 3) &&
+ return (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_BUTTON_RELEASE) &&
+ (ev->button == 3) &&
((ev->state & RelevantModifierKeyMask) == 0);
}
-bool
+bool
Keyboard::no_modifiers_active (guint state)
{
return (state & RelevantModifierKeyMask) == 0;
}
-static void
-accel_map_changed (GtkAccelMap* map,
- gchar* path,
- guint key,
- GdkModifierType mod,
- gpointer arg)
+static void
+accel_map_changed (GtkAccelMap* /*map*/,
+ gchar* /*path*/,
+ guint /*key*/,
+ GdkModifierType /*mod*/,
+ gpointer /*arg*/)
{
Keyboard::keybindings_changed ();
}
{
if (can_save_keybindings && bindings_changed_after_save_became_legal) {
Gtk::AccelMap::save (user_keybindings_path);
- }
+ }
}
void
ARDOUR::find_bindings_files (binding_files);
/* set up the per-user bindings path */
-
+
strs.push_back (Glib::get_home_dir());
strs.push_back (".ardour3");
strs.push_back ("ardour.bindings");
*/
if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
-
+
// just a style name - allow user to
- // specify the layout type.
-
+ // 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;
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 */
while (true) {
if (!Glib::path_is_absolute (keybindings_path)) {
-
+
/* not absolute - look in the usual places */
sys::path keybindings_file;
SearchPath spath = ardour_search_path() + user_config_directory() + system_config_search_path();
if ( ! find_file_in_search_path (spath, keybindings_path, keybindings_file)) {
-
+
if (keybindings_path == default_bindings) {
error << _("Default keybindings not found - Ardour will be hard to use!") << endmsg;
return;
} else {
- warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
+ warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
keybindings_path)
<< endmsg;
keybindings_path = default_bindings;
keybindings_path = keybindings_file.to_string();
break;
-
+
}
} else {
-
+
/* path is absolute already */
if (!Glib::file_test (keybindings_path, Glib::FILE_TEST_EXISTS)) {
error << _("Default keybindings not found - Ardour will be hard to use!") << endmsg;
return;
} else {
- warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
+ warning << string_compose (_("Key bindings file \"%1\" not found. Default bindings used instead"),
keybindings_path)
<< endmsg;
keybindings_path = default_bindings;
Keyboard::load_keybindings (string path)
{
try {
- cerr << "loading bindings from " << path << endl;
+ info << "Loading bindings from " << path << endl;
Gtk::AccelMap::load (path);
vector<string> groups;
vector<string> names;
vector<AccelKey> bindings;
-
+
ActionManager::get_all_actions (groups, names, bindings);
-
+
vector<string>::iterator g;
vector<AccelKey>::iterator b;
vector<string>::iterator n;
release_keys.clear ();
+ bool show_bindings = (getenv ("ARDOUR_SHOW_BINDINGS") != 0);
+
+ for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
+
+ if (show_bindings) {
+
+ cerr << "Action: " << (*n) << " Group: " << (*g) << " binding = ";
+
+ if ((*b).get_key() != GDK_VoidSymbol) {
+ cerr << (*b).get_key() << " w/mod = " << hex << (*b).get_mod() << dec << " = " << (*b).get_abbrev();
+ } else {
+ cerr << "unbound";
+ }
+
+ cerr << endl;
+ }
+ }
+
for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
if ((*b).get_mod() & Gdk::RELEASE_MASK) {
release_keys.insert (pair<AccelKey,two_strings> (*b, two_strings (*g, *n)));