, secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false))
, big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
, video_timeline(0)
+ , global_actions (X_("global"))
, ignore_dual_punch (false)
, editor (0)
, mixer (0)
, meterbridge (0)
, rc_option_editor (0)
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
- , key_editor (X_("key-editor"), _("Key Bindings"))
, add_route_dialog (X_("add-routes"), _("Add Tracks/Busses"))
, about (X_("about"), _("About"))
, location_ui (X_("locations"), _("Locations"))
, audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup"))
, export_video_dialog (X_("video-export"), _("Video Export Dialog"))
, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
- , add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
+ , add_video_dialog (X_("add-video"), _("Add Video"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
, big_clock_window (X_("big-clock"), _("Big Clock"), boost::bind (&ARDOUR_UI::create_big_clock_window, this))
, audio_port_matrix (X_("audio-connection-manager"), _("Audio Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::AUDIO))
, midi_port_matrix (X_("midi-connection-manager"), _("MIDI Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::MIDI))
+ , key_editor (X_("key-editor"), _("Bindings Editor"), boost::bind (&ARDOUR_UI::create_key_editor, this))
, video_server_process (0)
, splash (0)
, have_configure_timeout (false)
}
/* Separate windows */
-
+
WM::Manager::instance().register_window (&key_editor);
WM::Manager::instance().register_window (&session_option_editor);
WM::Manager::instance().register_window (&speaker_config_window);
check_memory_locking();
- /* this is the first point at which all the keybindings are available */
+ /* this is the first point at which all the possible actions are
+ * available, because some of the available actions are dependent on
+ * aspects of the engine/backend.
+ */
if (ARDOUR_COMMAND_LINE::show_key_actions) {
- vector<string> names;
+
+
vector<string> paths;
+ vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
- ActionManager::get_all_actions (names, paths, tooltips, keys, bindings);
+ Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
- vector<string>::iterator n;
vector<string>::iterator k;
vector<string>::iterator p;
- for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
- cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
+
+ for (p = paths.begin(), k = keys.begin(); p != paths.end(); ++k, ++p) {
+
+ if ((*k).empty()) {
+ cout << *p << endl;
+ } else {
+ cout << *p << " => " << *k << endl;
+ }
}
halt_connection.disconnect ();
/* set default clock modes */
- if (Profile->get_sae()) {
- primary_clock->set_mode (AudioClock::BBT);
- secondary_clock->set_mode (AudioClock::MinSec);
- } else {
- primary_clock->set_mode (AudioClock::Timecode);
- secondary_clock->set_mode (AudioClock::BBT);
- }
+ primary_clock->set_mode (AudioClock::Timecode);
+ secondary_clock->set_mode (AudioClock::BBT);
/* start the time-of-day-clock */
{
if (!AudioEngine::instance()->connected()) {
MessageDialog msg (parent, string_compose (
- _("%1 is not connected to any audio backend.\n"
- "You cannot open or close sessions in this condition"),
+ _("%1 is not connected to any audio backend.\n"
+ "You cannot open or close sessions in this condition"),
PROGRAM_NAME));
pop_back_splash (msg);
msg.run ();
void
ARDOUR_UI::open_session ()
{
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
{
ArdourPrompter prompter (true);
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
{
BusProfile bus_profile;
- if (nsm || Profile->get_sae()) {
+ if (nsm) {
bus_profile.master_out_channels = 2;
bus_profile.input_ac = AutoConnectPhysical;
void
ARDOUR_UI::close_session()
{
- if (!check_audioengine(*editor)) {
+ if (!check_audioengine (_main_window)) {
return;
}
Profile->set_small_screen ();
}
- if (g_getenv ("ARDOUR_SAE")) {
- Profile->set_sae ();
- Profile->set_single_package ();
- }
-
if (g_getenv ("TRX")) {
Profile->set_trx ();
}
if (!window_icons.empty()) {
window.set_default_icon_list (window_icons);
}
-
+
Gtkmm2ext::WindowTitle title (Glib::get_application_name());
if (!name.empty()) {
/* until we get ardour bindings working, we are not handling key
* releases yet.
*/
-
+
if (ev->type != GDK_KEY_PRESS) {
return false;
}
-
+
if (event_window == &_main_window) {
window = event_window;
-
+
/* find current tab contents */
Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page());
if (w) {
bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(w->get_data ("ardour-bindings"));
- } else {
- bindings = &_global_bindings;
}
- } else if (event_window != 0) {
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("main window key event, bindings = %1, global = %2\n", bindings, &global_bindings));
+
+ } else {
window = event_window;
-
+
/* see if window uses ardour binding system */
bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(window->get_data ("ardour-bindings"));
-
- }
+ }
/* An empty binding set is treated as if it doesn't exist */
-
+
if (bindings && bindings->empty()) {
bindings = 0;
}
-
+
return key_press_focus_accelerator_handler (*window, ev, bindings);
}
-
+
bool
ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings* bindings)
{
Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier);
if (focus) {
-
+
/* some widget has keyboard focus */
if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
/* A particular kind of focusable widget currently has keyboard
* focus. All unmodified key events should go to that widget
- * first and not be used as an accelerator by default
+ * first and not be used as an accelerator by default
*/
special_handling_of_unmodified_accelerators = true;
all "normal text" accelerators.
*/
-
+
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");
ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group, gdk_keyval_name (ev->keyval)));
DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
+ KeyboardKey k (ev->state, ev->keyval);
if (bindings) {
- DEBUG_TRACE (DEBUG::Accelerators, "\tusing Ardour bindings for this window\n");
- KeyboardKey k (ev->state, ev->keyval);
-
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing Ardour bindings %1 for this event\n", bindings));
+
if (bindings->activate (k, Bindings::Press)) {
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, "\tnot yet handled, try global bindings\n");
+
+ if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
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)) {
DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate handled\n");
return true;
}
} else {
-
+
/* no modifiers, propagate first */
-
+
DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
-
+
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");
-
+ KeyboardKey k (ev->state, ev->keyval);
+
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, "\tnot yet handled, try global bindings\n");
+
+ if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
return true;
}
}
- DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
-
- KeyboardKey k (ev->state, ev->keyval);
-
- if (_global_bindings.activate (k, Bindings::Press)) {
- DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
- return true;
- }
-
DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n");
return true;
}
-bool
-ARDOUR_UI::try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier)
+void
+ARDOUR_UI::load_bindings ()
{
- 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 ((global_bindings = Bindings::get_bindings ("global", global_actions)) == 0) {
+ error << _("Global keybindings are missing") << endmsg;
+ }
+}
- 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)));
+void
+ARDOUR_UI::cancel_solo ()
+{
+ if (_session) {
+ if (_session->soloing()) {
+ _session->set_solo (_session->get_routes(), false);
+ } else if (_session->listening()) {
+ _session->set_listen (_session->get_routes(), false);
}
- }
-
- if (gtk_accel_groups_activate (G_OBJECT(win), fakekey, modifier)) {
- DEBUG_TRACE (DEBUG::Accelerators, "\tGTK accel group activated\n");
- return true;
- }
- return false;
+ _session->clear_all_solo_state (_session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
+ }
}