From 4166b05bdacd2e77352c4eb4e960146f338df0c3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 14 Jan 2015 20:31:38 -0500 Subject: [PATCH] Fix setting command key bindings on OSX. --- gtk2_ardour/keyeditor.cc | 5 ++++- gtk2_ardour/utils.cc | 19 +------------------ libs/gtkmm2ext/gtkmm2ext/utils.h | 1 + libs/gtkmm2ext/utils.cc | 24 ++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc index 85522a7e41..f8b5f2da4e 100644 --- a/gtk2_ardour/keyeditor.cc +++ b/gtk2_ardour/keyeditor.cc @@ -203,11 +203,14 @@ KeyEditor::on_key_release_event (GdkEventKey* ev) goto out; } + GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & ev->state); + Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (ev->keyval); + Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (mod); bool result = AccelMap::change_entry (path, last_keyval, - ModifierType (Keyboard::RelevantModifierKeyMask & ev->state), + Gdk::ModifierType(mod), true); if (result) { diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index c9d3abe111..a88ee7f9a5 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -450,24 +450,7 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv GdkModifierType mod = GdkModifierType (ev->state); mod = GdkModifierType (mod & gtk_accelerator_get_default_mod_mask()); -#ifdef GTKOSX - /* GTK on OS X is currently (February 2012) setting both - the Meta and Mod2 bits in the event modifier state if - the Command key is down. - - gtk_accel_groups_activate() does not invoke any of the logic - that gtk_window_activate_key() will that sorts out that stupid - state of affairs, and as a result it fails to find a match - for the key event and the current set of accelerators. - - to fix this, if the meta bit is set, remove the mod2 bit - from the modifier. this assumes that our bindings use Primary - which will have set the meta bit in the accelerator entry. - */ - if (mod & GDK_META_MASK) { - mod = GdkModifierType (mod & ~GDK_MOD2_MASK); - } -#endif + Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(mod); if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, mod)) { DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n"); diff --git a/libs/gtkmm2ext/gtkmm2ext/utils.h b/libs/gtkmm2ext/gtkmm2ext/utils.h index daae1b78aa..53c8ea2fdf 100644 --- a/libs/gtkmm2ext/gtkmm2ext/utils.h +++ b/libs/gtkmm2ext/gtkmm2ext/utils.h @@ -110,6 +110,7 @@ namespace Gtkmm2ext { LIBGTKMM2EXT_API Glib::RefPtr window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent); LIBGTKMM2EXT_API bool possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval); + LIBGTKMM2EXT_API bool possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod); LIBGTKMM2EXT_API uint32_t possibly_translate_legal_accelerator_to_real_key (uint32_t keyval); LIBGTKMM2EXT_API int physical_screen_height (Glib::RefPtr); diff --git a/libs/gtkmm2ext/utils.cc b/libs/gtkmm2ext/utils.cc index b4926ac43b..f7e96f09c8 100644 --- a/libs/gtkmm2ext/utils.cc +++ b/libs/gtkmm2ext/utils.cc @@ -337,6 +337,30 @@ Gtkmm2ext::detach_menu (Gtk::Menu& menu) } } +bool +Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod) +{ +#ifdef GTKOSX + /* GTK on OS X is currently (February 2012) setting both + the Meta and Mod2 bits in the event modifier state if + the Command key is down. + + gtk_accel_groups_activate() does not invoke any of the logic + that gtk_window_activate_key() will that sorts out that stupid + state of affairs, and as a result it fails to find a match + for the key event and the current set of accelerators. + + to fix this, if the meta bit is set, remove the mod2 bit + from the modifier. this assumes that our bindings use Primary + which will have set the meta bit in the accelerator entry. + */ + if (mod & GDK_META_MASK) { + mod = GdkModifierType (mod & ~GDK_MOD2_MASK); + } +#endif + return true; +} + bool Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval) {