13
0

Fix setting command key bindings on OSX.

This commit is contained in:
David Robillard 2015-01-14 20:31:38 -05:00
parent af1a064ebf
commit 4166b05bda
4 changed files with 30 additions and 19 deletions

View File

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

View File

@ -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");

View File

@ -110,6 +110,7 @@ namespace Gtkmm2ext {
LIBGTKMM2EXT_API Glib::RefPtr<Gdk::Window> 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<Gdk::Window>);

View File

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