diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index ba7abc1019..1754abb808 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2066,7 +2066,6 @@ ARDOUR_UI::get_smart_mode() const void ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) { - PBD::stacktrace (cerr, 30); if (!_session) { return; } @@ -5189,7 +5188,8 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey bool special_handling_of_unmodified_accelerators = false; /* consider all relevant modifiers but not LOCK or SHIFT */ const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK)); - GdkModifierType modifier = GdkModifierType (ev->state); + + GdkModifierType modifier = GdkModifierType (ev->state); modifier = GdkModifierType (modifier & gtk_accelerator_get_default_mod_mask()); Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier); @@ -5248,46 +5248,9 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey all "normal text" accelerators. */ - if (!special_handling_of_unmodified_accelerators && !bindings) { - - /* XXX note that for a brief moment, the conditional above - * included "|| (ev->state & mask)" so as to enforce the - * implication of special_handling_of_UNMODIFIED_accelerators. - * however, this forces any key that GTK doesn't allow and that - * we have an alternative (see next comment) for to be - * automatically sent through the accel groups activation - * pathway, which prevents individual widgets & canvas items - * from ever seeing it if is used by a key binding. - * - * specifically, this hid Ctrl-down-arrow from MIDI region - * views because it is also bound to an action. - * - * until we have a robust, clean binding system, this - * quirk will have to remain in place. - */ - - /* pretend that certain key events that GTK does not allow - to be used as accelerators are actually something that - it does allow. but only where there are no modifiers. - */ - - uint32_t fakekey = ev->keyval; - - if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) { - DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels\n", - ev->keyval, fakekey)); - - DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tmodified modifier was %1\n", show_gdk_event_state (modifier))); - - if (gtk_accel_groups_activate(G_OBJECT(win), fakekey, modifier)) { - DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n"); - return true; - } - } - } - + if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) { - + /* no special handling or there are modifiers in effect: accelerate first */ DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n"); @@ -5305,17 +5268,14 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); return true; } - - } else { - - DEBUG_TRACE (DEBUG::Accelerators, "\tusing GTK accelerators for this window\n"); - - if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) { - DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); - return true; - } } + if (try_gtk_accel_binding (win, ev, !special_handling_of_unmodified_accelerators, modifier)) { + DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); + return true; + } + + DEBUG_TRACE (DEBUG::Accelerators, "\tnot accelerated, now propagate\n"); if (gtk_window_propagate_key_event (win, ev)) { @@ -5329,32 +5289,31 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n"); - if (!gtk_window_propagate_key_event (win, ev)) { - DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n"); - - if (bindings) { - - DEBUG_TRACE (DEBUG::Accelerators, "\tusing Ardour bindings for this window\n"); - KeyboardKey k (ev->state, ev->keyval); - - if (bindings->activate (k, Bindings::Press)) { - DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); - return true; - } - - } else { - - DEBUG_TRACE (DEBUG::Accelerators, "\tusing GTK accelerators for this window\n"); - - if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) { - DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); - return true; - } - } - } else { + if (gtk_window_propagate_key_event (win, ev)) { DEBUG_TRACE (DEBUG::Accelerators, "\thandled by propagate\n"); return true; } + + DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n"); + + if (bindings) { + + DEBUG_TRACE (DEBUG::Accelerators, "\tusing Ardour bindings for this window\n"); + KeyboardKey k (ev->state, ev->keyval); + + if (bindings->activate (k, Bindings::Press)) { + DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); + return true; + } + + } + + DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try GTK bindings\n"); + + if (try_gtk_accel_binding (win, ev, !special_handling_of_unmodified_accelerators, modifier)) { + DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); + return true; + } } DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n"); @@ -5365,7 +5324,33 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); return true; } - - DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n"); + + DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n"); return true; } + +bool +ARDOUR_UI::try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier) +{ + uint32_t fakekey = ev->keyval; + + if (translate) { + + /* pretend that certain key events that GTK does not allow + to be used as accelerators are actually something that + it does allow. but only where there are no modifiers. + */ + + if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) { + DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels, modifier was %3\n", + ev->keyval, fakekey, show_gdk_event_state (modifier))); + } + } + + if (gtk_accel_groups_activate (G_OBJECT(win), fakekey, modifier)) { + DEBUG_TRACE (DEBUG::Accelerators, "\tGTK accel group activated\n"); + return true; + } + + return false; +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index a18703249f..ce4125edca 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -832,6 +832,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void tabs_page_added (Gtk::Widget*, guint page_number); void tabs_page_removed (Gtk::Widget*, guint page_number); bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings*); + bool try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier); + }; #endif /* __ardour_gui_h__ */