summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-01-17 17:25:04 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-01-17 17:25:04 +0000
commit8001cba98532c17562011ea42a48b2f34930de7e (patch)
tree976d47cf7365816d048c8a71ea08e859ce1555ac
parent7280d39effb471cd3a3d6b91a3962160c65b9878 (diff)
(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
-rw-r--r--gtk2_ardour/evtest.cc6
-rw-r--r--gtk2_ardour/utils.cc85
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-<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) {