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:
nick_m 2016-08-14 01:16:48 +10:00
parent 1c0651f7f4
commit c62026b567
4 changed files with 76 additions and 60 deletions

View file

@ -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