diff options
Diffstat (limited to 'gtk2_ardour/keyboard.cc')
-rw-r--r-- | gtk2_ardour/keyboard.cc | 149 |
1 files changed, 147 insertions, 2 deletions
diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc index ca65a2b3f2..96c73f63d4 100644 --- a/gtk2_ardour/keyboard.cc +++ b/gtk2_ardour/keyboard.cc @@ -48,6 +48,14 @@ accel_map_changed (GtkAccelMap* /*map*/, me->ui.setup_tooltips (); } +guint ArdourKeyboard::constraint_mod = Keyboard::SecondaryModifier; +guint ArdourKeyboard::trim_contents_mod = Keyboard::PrimaryModifier; +guint ArdourKeyboard::trim_overlap_mod = Keyboard::TertiaryModifier; +guint ArdourKeyboard::trim_anchored_mod = Keyboard::TertiaryModifier; +guint ArdourKeyboard::fine_adjust_mod = Keyboard::SecondaryModifier; +guint ArdourKeyboard::push_points_mod = Keyboard::PrimaryModifier; +guint ArdourKeyboard::note_size_relative_mod = Keyboard::PrimaryModifier; + void ArdourKeyboard::setup_keybindings () { @@ -174,6 +182,145 @@ ArdourKeyboard::setup_keybindings () g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this); } +XMLNode& +ArdourKeyboard::get_state (void) +{ + XMLNode* node = &Keyboard::get_state (); + char buf[32]; + + snprintf (buf, sizeof (buf), "%d", constraint_mod); + node->add_property ("constraint-modifier", buf); + snprintf (buf, sizeof (buf), "%d", trim_contents_mod); + node->add_property ("trim-contents-modifier", buf); + snprintf (buf, sizeof (buf), "%d", trim_overlap_mod); + node->add_property ("trim-overlap-modifier", buf); + snprintf (buf, sizeof (buf), "%d", trim_anchored_mod); + node->add_property ("trim-anchored-modifier", buf); + snprintf (buf, sizeof (buf), "%d", fine_adjust_mod); + node->add_property ("fine-adjust-modifier", buf); + snprintf (buf, sizeof (buf), "%d", push_points_mod); + node->add_property ("push-points-modifier", buf); + snprintf (buf, sizeof (buf), "%d", note_size_relative_mod); + node->add_property ("note-size-relative-modifier", buf); + + return *node; +} + +int +ArdourKeyboard::set_state (const XMLNode& node, int version) +{ + const XMLProperty* prop; + + if ((prop = node.property ("constraint-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &constraint_mod); + } + + if ((prop = node.property ("trim-contents-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &trim_contents_mod); + } + + if ((prop = node.property ("trim-overlap-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &trim_overlap_mod); + } + + if ((prop = node.property ("trim-anchored-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &trim_anchored_mod); + } + + if ((prop = node.property ("fine-adjust-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &fine_adjust_mod); + } + + if ((prop = node.property ("push-points-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", &push_points_mod); + } + + if ((prop = node.property ("note-size-relative-modifier")) != 0) { + sscanf (prop->value().c_str(), "%d", ¬e_size_relative_mod); + } + + return Keyboard::set_state (node, version); +} + +/* Snap and snap delta modifiers may contain each other, so we use the + * following two methods to sort that out: + */ +bool +ArdourKeyboard::indicates_snap (guint state) +{ + const bool contains_s = Keyboard::modifier_state_contains (state, Keyboard::snap_modifier()); + const bool contains_d = Keyboard::modifier_state_contains (state, Keyboard::snap_delta_modifier()); + const bool equals_d = Keyboard::modifier_state_equals (state, Keyboard::snap_delta_modifier()); + + return (contains_s && ((contains_d && !equals_d) || !contains_d)); +} + +bool +ArdourKeyboard::indicates_snap_delta (guint state) +{ + const bool contains_d = Keyboard::modifier_state_contains (state, Keyboard::snap_delta_modifier()); + const bool contains_s = Keyboard::modifier_state_contains (state, Keyboard::snap_modifier()); + const bool equals_s = Keyboard::modifier_state_equals (state, Keyboard::snap_modifier()); + + return (contains_d && ((contains_s && !equals_s) || !contains_s)); +} + +void +ArdourKeyboard::set_constraint_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~constraint_mod); + constraint_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | constraint_mod); +} + +void +ArdourKeyboard::set_trim_contents_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_contents_mod); + trim_contents_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_contents_mod); +} + +void +ArdourKeyboard::set_trim_overlap_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_overlap_mod); + trim_overlap_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_overlap_mod); +} + +void +ArdourKeyboard::set_trim_anchored_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_anchored_mod); + trim_anchored_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_anchored_mod); +} + +void +ArdourKeyboard::set_fine_adjust_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~fine_adjust_mod); + fine_adjust_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | fine_adjust_mod); +} + +void +ArdourKeyboard::set_push_points_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~push_points_mod); + push_points_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | push_points_mod); +} + +void +ArdourKeyboard::set_note_size_relative_modifier (guint mod) +{ + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~note_size_relative_mod); + note_size_relative_mod = mod; + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | note_size_relative_mod); +} + Selection::Operation ArdourKeyboard::selection_type (guint state) { @@ -187,5 +334,3 @@ ArdourKeyboard::selection_type (guint state) return Selection::Set; } } - - |