diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index 7f7e810e87..7e41373f79 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -399,6 +399,7 @@ ARDOUR_UI::livetrax_setup_windows () Gtk::VBox* vb; Gtk::HBox* hb; ArdourButton::Element elements (ArdourButton::Element (ArdourButton::Text|ArdourButton::VectorIcon)); + Gtkmm2ext::Bindings* bindings; livetrax_top_bar.set_spacing (12); livetrax_top_bar.set_border_width (12); @@ -474,7 +475,7 @@ ARDOUR_UI::livetrax_setup_windows () livetrax_edit_vscrollbar->show (); hb->pack_start (editor->contents(), true, true); hb->pack_start (*livetrax_edit_vscrollbar, false, false); - + vb = manage (new Gtk::VBox); livetrax_edit_hscrollbar = manage (new Gtk::HScrollbar (editor->horizontal_adjustment)); livetrax_edit_hscrollbar->show (); @@ -499,6 +500,11 @@ ARDOUR_UI::livetrax_setup_windows () setup_tooltips (); build_menu_bar (); + bindings = Bindings::get_bindings (X_("Editor")); + livetrax_editor_bar.set_data ("ardour-bindings", bindings); + bindings = Bindings::get_bindings (X_("Mixer")); + livetrax_mixer_bar.set_data ("ardour-bindings", bindings); + // setup_tooltips (); _main_window.signal_delete_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::main_window_delete_event)); diff --git a/gtk2_ardour/ardour_ui_keys.cc b/gtk2_ardour/ardour_ui_keys.cc index e32dc2877c..9df728a0db 100644 --- a/gtk2_ardour/ardour_ui_keys.cc +++ b/gtk2_ardour/ardour_ui_keys.cc @@ -143,7 +143,7 @@ ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey } } - DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 [title = %9] focus = %7 (%8) Key event: code = %2 [%10] state = %3 special handling ? %4 magic widget focus ? %5 focus widget %6 named %7 mods ? %8\n", + DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 [title = %9] focus = %7 (mods %8) Key event: code = %2 [%10] state = %3 special handling ? %4 magic widget focus ? %5 focus widget %6 named %7 mods ? %8\n", win, ev->keyval, Gtkmm2ext::show_gdk_event_state (ev->state), diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index e449273327..18bc23083c 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1316,7 +1316,7 @@ private: void register_actions (); void register_region_actions (); - void register_midi_actions (Gtkmm2ext::Bindings*); + void register_midi_actions (); void load_bindings (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index dd3cae3681..41fe2a0d28 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -790,7 +790,7 @@ Editor::register_actions () } void -Editor::register_midi_actions (Bindings* midi_bindings) +Editor::register_midi_actions () { _midi_actions = ActionManager::create_action_group (midi_bindings, X_("Notes")); @@ -985,7 +985,9 @@ void Editor::load_bindings () { bindings = Bindings::get_bindings (X_("Editor")); - global_hpacker.set_data ("ardour-bindings", bindings); + midi_bindings = Bindings::get_bindings (X_("MIDI")); + + register_midi_actions (); /* This set of bindings may expand in the future to include things * other than MIDI editing, but for now this is all we've got as far as @@ -993,11 +995,11 @@ Editor::load_bindings () * the keys may overlap. */ - Bindings* midi_bindings = Bindings::get_bindings (X_("MIDI")); - register_midi_actions (midi_bindings); - - _track_canvas_viewport->canvas()->set_data ("ardour-bindings", midi_bindings); + if (!Profile->get_livetrax()) { + global_hpacker.set_data ("ardour-bindings", bindings); + _track_canvas_viewport->canvas()->set_data ("ardour-bindings", midi_bindings); + } } void diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 813aa13678..66a2106931 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -975,7 +975,7 @@ Editor::entered_track_canvas (GdkEventCrossing* ev) if (!was_within) { - if (internal_editing()) { + if (internal_editing() || Profile->get_livetrax()) { /* ensure that key events go here because there are internal editing bindings associated only with the canvas. if the focus is elsewhere, we cannot find them. diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index d13c6ecd07..7346f8b119 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -453,7 +453,7 @@ MixerStrip::~MixerStrip () void MixerStrip::vca_assign (std::shared_ptr vca) { - std::shared_ptr sl = std::dynamic_pointer_cast ( route() ); + std::shared_ptr sl = std::dynamic_pointer_cast (route()); if (sl) sl->assign(vca); } @@ -461,14 +461,19 @@ MixerStrip::vca_assign (std::shared_ptr vca) void MixerStrip::vca_unassign (std::shared_ptr vca) { - std::shared_ptr sl = std::dynamic_pointer_cast ( route() ); - if (sl) + std::shared_ptr sl = std::dynamic_pointer_cast (route()); + if (sl) { sl->unassign(vca); + } } bool -MixerStrip::mixer_strip_enter_event (GdkEventCrossing* /*ev*/) +MixerStrip::mixer_strip_enter_event (GdkEventCrossing* ev) { + if (ev->detail != GDK_NOTIFY_INFERIOR) { + _mixer.steal_focus (); + } + _entered_mixer_strip = this; return false; @@ -478,7 +483,7 @@ bool MixerStrip::mixer_strip_leave_event (GdkEventCrossing *ev) { //if we have moved outside our strip, but not into a child view, then deselect ourselves - if ( !(ev->detail == GDK_NOTIFY_INFERIOR) ) { + if (ev->detail != GDK_NOTIFY_INFERIOR) { _entered_mixer_strip= 0; //clear keyboard focus in the gain display. this is cheesy but fixes a longstanding "bug" where the user starts typing in the gain entry, and leaves it active, thereby prohibiting other keybindings from working diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 0097a494eb..e337643894 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -165,6 +165,8 @@ Mixer_UI::Mixer_UI () scroller_base.set_name ("MixerWindow"); scroller_base.signal_button_press_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); + scroller_base.signal_enter_notify_event ().connect (sigc::mem_fun (*this, &Mixer_UI::scroller_enter), false); + /* set up drag-n-drop */ vector target_table; @@ -521,8 +523,17 @@ Mixer_UI::show_window () ms->parameter_changed (X_("mixer-element-visibility")); } - /* force focus into main area */ - scroller_base.grab_focus (); + if (!Profile->get_livetrax()) { + /* force focus into main area */ + scroller_base.grab_focus (); + } +} + +bool +Mixer_UI::scroller_enter (GdkEventCrossing* ev) +{ + steal_focus (); + return false; } void @@ -4436,3 +4447,11 @@ Mixer_UI::sync_surround_action () Glib::RefPtr surround_export = ActionManager::get_action (X_("Main"), X_("SurroundExport")); surround_export->set_sensitive (have_sm && _session->vapor_export_barrier ()); } + +void +Mixer_UI::steal_focus () +{ + if (Profile->get_livetrax()) { + scroller_base.grab_focus (); + } +} diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index 7d33e1ac02..e1dd1b5e76 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -169,7 +169,7 @@ public: void toggle_monitor_action (ARDOUR::MonitorChoice monitor_choice, bool group_override = false, bool all = false); - Gtk::ScrolledWindow scroller; + void steal_focus (); protected: void set_axis_targets_for_operation (); @@ -181,6 +181,7 @@ private: Gtk::VBox _content; Gtk::HBox global_hpacker; Gtk::VBox global_vpacker; + Gtk::ScrolledWindow scroller; Gtk::EventBox scroller_base; Gtk::HBox scroller_hpacker; Gtk::VBox mixer_scroller_vpacker; @@ -235,6 +236,7 @@ private: void scroller_drag_data_received (const Glib::RefPtr&, int, int, const Gtk::SelectionData&, guint, guint); bool strip_scroller_button_event (GdkEventButton*); + bool scroller_enter (GdkEventCrossing*); void scroll_left (); void scroll_right (); void vca_scroll_left (); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index b9c8eea6db..7b68ab3213 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -600,6 +600,7 @@ public: PBD::Signal0 MouseModeChanged; Gtkmm2ext::Bindings* bindings; + Gtkmm2ext::Bindings* midi_bindings; virtual SelectionPropertiesBox& properties_box() const = 0; Gtk::HBox* mouse_mode_hbox;