From 8001cba98532c17562011ea42a48b2f34930de7e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 17 Jan 2010 17:25:04 +0000 Subject: (OS X only) if key focus is not in a text entry or a "magic" widget, convert key press events that generated math chars and so forth (generally -) back to their non-math equivalent before processing. this permits bindings to work as expected. i note that GTK/OSX does not appear to allow insertion of the accented chars into text entries anyway git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6511 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/evtest.cc | 6 ++-- gtk2_ardour/utils.cc | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/evtest.cc b/gtk2_ardour/evtest.cc index db8d502e70..1dc1c037f4 100644 --- a/gtk2_ardour/evtest.cc +++ b/gtk2_ardour/evtest.cc @@ -6,6 +6,8 @@ using namespace std; bool print_event (GdkEvent* event) { + const gchar* kstr; + cerr << hex; cerr << "Event: type = " << event->type << ' '; @@ -38,7 +40,7 @@ print_event (GdkEvent* event) cerr << "Key press, keycode = " << event->key.keyval << " name " - << gdk_keyval_name (event->key.keyval) + << ((kstr = gdk_keyval_name (event->key.keyval)) ? kstr : "UNKNOWN KEY") << " state = " << event->key.state << " hw keycode = " @@ -52,7 +54,7 @@ print_event (GdkEvent* event) cerr << "Key release, keycode = " << event->key.keyval << " name " - << gdk_keyval_name (event->key.keyval) + << ((kstr = gdk_keyval_name (event->key.keyval)) ? kstr : "UNKNOWN KEY") << " state = " << event->key.state << " hw keycode = " diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index a6b3f4f16c..c6e495acfc 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -410,6 +410,73 @@ relay_key_press (GdkEventKey* ev, Gtk::Window* win) } } +#ifdef GTKOSX +static guint +osx_keyval_without_alt (guint accent_keyval) +{ + switch (accent_keyval) { + case GDK_oe: + return GDK_q; + case GDK_registered: + return GDK_r; + case GDK_dagger: + return GDK_t; + case GDK_yen: + return GDK_y; + case GDK_diaeresis: + return GDK_u; + case GDK_oslash: + return GDK_o; + case GDK_Greek_pi: + return GDK_p; + case GDK_leftdoublequotemark: + return GDK_bracketleft; + case GDK_leftsinglequotemark: + return GDK_bracketright; + case GDK_guillemotleft: + return GDK_backslash; + case GDK_aring: + return GDK_a; + case GDK_ssharp: + return GDK_s; + case GDK_partialderivative: + return GDK_d; + case GDK_function: + return GDK_f; + case GDK_copyright: + return GDK_g; + case GDK_abovedot: + return GDK_h; + case GDK_notsign: + return GDK_l; + case GDK_ellipsis: + return GDK_semicolon; + case GDK_ae: + return GDK_apostrophe; + case GDK_Greek_OMEGA: + return GDK_z; + case GDK_ccedilla: + return GDK_c; + case GDK_radical: + return GDK_v; + case GDK_integral: + return GDK_b; + case GDK_mu: + return GDK_m; + case GDK_lessthanequal: + return GDK_comma; + case GDK_greaterthanequal: + return GDK_period; + case GDK_division: + return GDK_slash; + default: + break; + } + + return GDK_VoidSymbol; +} +#endif + bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) { @@ -488,6 +555,24 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) all "normal text" accelerators. */ +#ifdef GTKOSX + if (!special_handling_of_unmodified_accelerators) { + if (ev->state & GDK_MOD1_MASK) { + /* we're not in a text entry or "magic focus" widget so we don't want OS X "special-character" + text-style handling of alt-. change the keyval back to what it would be without + the alt key. this way, we see -v rather than -radical and so on. + */ + guint keyval_without_alt = osx_keyval_without_alt (ev->keyval); + + if (keyval_without_alt != GDK_VoidSymbol) { +#ifdef DEBUG_ACCELERATOR_HANDLING + cerr << "Remapped " << gdk_keyval_name (ev->keyval) << " to " << gdk_keyval_name (keyval_without_alt) << endl; + +#endif ev->keyval = keyval_without_alt; + } + } + } +#endif if (!special_handling_of_unmodified_accelerators) { -- cgit v1.2.3