guint ArdourKeyboard::push_points_mod = Keyboard::PrimaryModifier;
guint ArdourKeyboard::note_size_relative_mod = Keyboard::PrimaryModifier;
+ArdourKeyboard::ArdourKeyboard (ARDOUR_UI& ardour_ui) : ui (ardour_ui)
+{
+ Keyboard::RelevantModifierKeysChanged.connect (sigc::mem_fun (*this, &ArdourKeyboard::reset_relevant_modifier_key_mask));
+}
+
void
ArdourKeyboard::find_bindings_files (map<string,string>& files)
{
return Keyboard::set_state (node, version);
}
+void
+ArdourKeyboard::reset_relevant_modifier_key_mask ()
+{
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | constraint_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_contents_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_overlap_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_anchored_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | fine_adjust_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | push_points_mod);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | note_size_relative_mod);
+}
+
/* Snap and snap delta modifiers may contain each other, so we use the
* following two methods to sort that out:
*/
void
ArdourKeyboard::set_constraint_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~constraint_mod);
constraint_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | constraint_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
void
ArdourKeyboard::set_trim_contents_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_contents_mod);
trim_contents_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_contents_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
void
ArdourKeyboard::set_trim_overlap_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_overlap_mod);
trim_overlap_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_overlap_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
void
ArdourKeyboard::set_trim_anchored_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_anchored_mod);
trim_anchored_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_anchored_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
void
ArdourKeyboard::set_fine_adjust_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~fine_adjust_mod);
fine_adjust_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | fine_adjust_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
void
ArdourKeyboard::set_push_points_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~push_points_mod);
push_points_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | push_points_mod);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
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);
+ the_keyboard().reset_relevant_modifier_key_mask();
}
Selection::Operation
/* set this to initially contain the modifiers we care about, then track changes in ::set_edit_modifier() etc. */
GdkModifierType Keyboard::RelevantModifierKeyMask;
+sigc::signal0<void> Keyboard::RelevantModifierKeysChanged;
void
Keyboard::magic_widget_grab_focus ()
_current_binding_name = _("Unknown");
}
- RelevantModifierKeyMask = (GdkModifierType) gtk_accelerator_get_default_mod_mask ();
-
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
-
- gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
-
-#ifdef __APPLE__
- /* Remove SUPER,HYPER,META.
- *
- * GTK on OS X adds META when Command is pressed for various indefensible reasons, since
- * it also uses MOD2 to indicate Command. Our code assumes that each
- * modifier (Primary, Secondary etc.) is represented by a single bit in
- * the modifier mask, but GTK's (STUPID) design uses two (MOD2 + META)
- * to represent the Command key. Some discussion about this is here:
- * https://bugzilla.gnome.org/show_bug.cgi?id=692597
- *
- * We cannot do this until AFTER we told GTK what the default modifier
- * was, because otherwise it will fail to recognize MOD2-META-<key> as
- * an accelerator.
- *
- * Note that in the tabbed branch, we no longer use GTK accelerators
- * for functional purposes, so this is as critical for that branch.
- */
-
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_SUPER_MASK);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_HYPER_MASK);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK);
-#endif
+ reset_relevant_modifier_key_mask();
snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this);
}
return ret;
}
+void
+Keyboard::reset_relevant_modifier_key_mask ()
+{
+ RelevantModifierKeyMask = (GdkModifierType) gtk_accelerator_get_default_mod_mask ();
+
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
+
+ gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
+
+#ifdef __APPLE__
+ /* Remove SUPER,HYPER,META.
+ *
+ * GTK on OS X adds META when Command is pressed for various indefensible reasons, since
+ * it also uses MOD2 to indicate Command. Our code assumes that each
+ * modifier (Primary, Secondary etc.) is represented by a single bit in
+ * the modifier mask, but GTK's (STUPID) design uses two (MOD2 + META)
+ * to represent the Command key. Some discussion about this is here:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=692597
+ *
+ * We cannot do this until AFTER we told GTK what the default modifier
+ * was, because otherwise it will fail to recognize MOD2-META-<key> as
+ * an accelerator.
+ *
+ * Note that in the tabbed branch, we no longer use GTK accelerators
+ * for functional purposes, so this is as critical for that branch.
+ */
+
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_SUPER_MASK);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_HYPER_MASK);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK);
+#endif
+ RelevantModifierKeysChanged(); /* EMIT SIGNAL */
+}
+
void
Keyboard::close_current_dialog ()
{
void
Keyboard::set_edit_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~edit_mod);
edit_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | edit_mod);
+ reset_relevant_modifier_key_mask();
}
void
void
Keyboard::set_delete_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~delete_mod);
delete_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | delete_mod);
+ reset_relevant_modifier_key_mask();
}
void
void
Keyboard::set_insert_note_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~insert_note_mod);
insert_note_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | insert_note_mod);
+ reset_relevant_modifier_key_mask();
}
void
Keyboard::set_modifier (uint32_t newval, uint32_t& var)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~var);
var = newval;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | var);
+ reset_relevant_modifier_key_mask();
}
void
Keyboard::set_snap_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~snap_mod);
snap_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | snap_mod);
+ reset_relevant_modifier_key_mask();
}
void
Keyboard::set_snap_delta_modifier (guint mod)
{
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~snap_delta_mod);
snap_delta_mod = mod;
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | snap_delta_mod);
+ reset_relevant_modifier_key_mask();
}
bool