Ensure RelevantModifierKeyMask is updated on each modifier change.
- fixes bug where changing prefs in User Interaction only took effect on restart.
This commit is contained in:
parent
1c0651f7f4
commit
c62026b567
|
@ -50,6 +50,11 @@ guint ArdourKeyboard::fine_adjust_mod = Keyboard::SecondaryModifier;
|
|||
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)
|
||||
{
|
||||
|
@ -260,6 +265,18 @@ ArdourKeyboard::set_state (const XMLNode& node, int version)
|
|||
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:
|
||||
*/
|
||||
|
@ -286,57 +303,50 @@ ArdourKeyboard::indicates_snap_delta (guint state)
|
|||
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
|
||||
|
|
|
@ -33,7 +33,7 @@ class ARDOUR_UI;
|
|||
class ArdourKeyboard : public Gtkmm2ext::Keyboard
|
||||
{
|
||||
public:
|
||||
ArdourKeyboard(ARDOUR_UI& ardour_ui) : ui(ardour_ui) {}
|
||||
ArdourKeyboard(ARDOUR_UI&);
|
||||
|
||||
XMLNode& get_state (void);
|
||||
int set_state (const XMLNode&, int version);
|
||||
|
@ -44,6 +44,8 @@ class ArdourKeyboard : public Gtkmm2ext::Keyboard
|
|||
|
||||
ARDOUR_UI& ui;
|
||||
|
||||
void reset_relevant_modifier_key_mask ();
|
||||
|
||||
/** @param state The button state from a GdkEvent.
|
||||
* @return true if the modifier state indicates snap modifier
|
||||
*/
|
||||
|
|
|
@ -51,6 +51,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
|
|||
int set_state (const XMLNode&, int version);
|
||||
|
||||
virtual void setup_keybindings () = 0;
|
||||
static void reset_relevant_modifier_key_mask ();
|
||||
|
||||
typedef std::vector<uint32_t> State;
|
||||
typedef uint32_t ModifierMask;
|
||||
|
@ -183,6 +184,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
|
|||
int reset_bindings ();
|
||||
|
||||
sigc::signal0<void> ZoomVerticalModifierReleased;
|
||||
static sigc::signal0<void> RelevantModifierKeysChanged;
|
||||
|
||||
protected:
|
||||
static Keyboard* _the_keyboard;
|
||||
|
|
|
@ -127,6 +127,7 @@ Gtk::Window* Keyboard::pre_dialog_active_window = 0;
|
|||
|
||||
/* 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 ()
|
||||
|
@ -153,39 +154,7 @@ Keyboard::Keyboard ()
|
|||
_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);
|
||||
}
|
||||
|
@ -359,6 +328,45 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
|
|||
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 ()
|
||||
{
|
||||
|
@ -471,9 +479,8 @@ Keyboard::set_edit_button (guint but)
|
|||
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
|
||||
|
@ -485,9 +492,8 @@ Keyboard::set_delete_button (guint but)
|
|||
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
|
||||
|
@ -499,34 +505,30 @@ Keyboard::set_insert_note_button (guint but)
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue