(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 <alt>-<key>) 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
This commit is contained in:
Paul Davis 2010-01-17 17:25:04 +00:00
parent 7280d39eff
commit 8001cba985
2 changed files with 89 additions and 2 deletions

View file

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

View file

@ -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-<key>. change the keyval back to what it would be without
the alt key. this way, we see <alt>-v rather than <alt>-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) {