2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* This file contains any ARDOUR_UI methods that require knowledge of
21 the various dialog boxes, and exists so that no compilation dependency
22 exists between the main ARDOUR_UI modules and their respective classes.
23 This is to cut down on the compile times. It also helps with my sanity.
28 #include "pbd/convert.h"
30 #include "ardour/audioengine.h"
31 #include "ardour/automation_watch.h"
32 #include "ardour/control_protocol_manager.h"
33 #include "ardour/profile.h"
34 #include "ardour/session.h"
36 #include "control_protocol/control_protocol.h"
38 #include "gtkmm2ext/keyboard.h"
39 #include "gtkmm2ext/utils.h"
42 #include "add_route_dialog.h"
43 #include "add_video_dialog.h"
44 #include "ardour_ui.h"
45 #include "big_clock_window.h"
46 #include "bundle_manager.h"
47 #include "global_port_matrix.h"
48 #include "gui_object.h"
49 #include "gui_thread.h"
50 #include "keyeditor.h"
51 #include "location_ui.h"
52 #include "lua_script_manager.h"
53 #include "luawindow.h"
54 #include "main_clock.h"
55 #include "meterbridge.h"
56 #include "meter_patterns.h"
57 #include "monitor_section.h"
58 #include "midi_tracer.h"
59 #include "mini_timeline.h"
61 #include "public_editor.h"
62 #include "processor_box.h"
63 #include "rc_option_editor.h"
64 #include "route_params_ui.h"
65 #include "shuttle_control.h"
66 #include "session_option_editor.h"
67 #include "speaker_dialog.h"
70 #include "time_info_box.h"
75 using namespace ARDOUR;
79 using namespace Gtkmm2ext;
80 using namespace ArdourWidgets;
83 ARDOUR_UI::set_session (Session *s)
85 SessionHandlePtr::set_session (s);
88 WM::Manager::instance().set_session (s);
89 /* Session option editor cannot exist across change-of-session */
90 session_option_editor.drop_window ();
91 /* Ditto for AddVideoDialog */
92 add_video_dialog.drop_window ();
96 const XMLNode* node = _session->extra_xml (X_("UI"));
99 const XMLNodeList& children = node->children();
100 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
101 if ((*i)->name() == GUIObjectState::xml_node_name) {
102 gui_object_state->load (**i);
108 WM::Manager::instance().set_session (s);
110 AutomationWatch::instance().set_session (s);
112 shuttle_box.set_session (s);
113 mini_timeline.set_session (s);
114 time_info_box->set_session (s);
116 primary_clock->set_session (s);
117 secondary_clock->set_session (s);
118 big_clock->set_session (s);
119 video_timeline->set_session (s);
120 lua_script_window->set_session (s);
122 /* sensitize menu bar options that are now valid */
124 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
125 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
127 if (_session->locations()->num_range_markers()) {
128 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
130 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
133 if (!_session->monitor_out()) {
134 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
136 act->set_sensitive (false);
140 /* allow wastebasket flush again */
142 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
144 act->set_sensitive (true);
147 /* there are never any selections on startup */
149 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
150 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
151 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
152 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
153 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
155 rec_button.set_sensitive (true);
157 solo_alert_button.set_active (_session->soloing());
159 setup_session_options ();
161 blink_connection = Timers::blink_connect (sigc::mem_fun(*this, &ARDOUR_UI::blink_handler));
163 _session->SaveSessionRequested.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::save_session_at_its_request, this, _1), gui_context());
164 _session->StateSaved.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_title, this), gui_context());
165 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
166 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
167 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
168 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
170 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
171 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
172 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
173 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
174 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
175 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
176 _session->auto_loop_location_changed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::set_loop_sensitivity, this), gui_context ());
178 /* Clocks are on by default after we are connected to a session, so show that here.
181 connect_dependents_to_session (s);
183 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
184 restore their modes or are explicitly set, we will cause the "new" mode to be saved
185 back to the session XML ("Extra") state.
188 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
190 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
194 map_transport_state ();
196 second_connection = Timers::second_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second));
197 point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds));
198 point_zero_something_second_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds));
199 set_fps_timeout_connection();
203 if (meter_box.get_parent()) {
204 transport_hbox.remove (meter_box);
205 transport_hbox.remove (editor_meter_peak_display);
209 meter_box.remove(*editor_meter);
212 editor_meter_peak_display.hide();
215 if (meter_box.get_parent()) {
216 transport_hbox.remove (meter_box);
217 transport_hbox.remove (editor_meter_peak_display);
221 _session->master_out() &&
222 _session->master_out()->n_outputs().n(DataType::AUDIO) > 0) {
224 if (!ARDOUR::Profile->get_trx()) {
225 editor_meter = new LevelMeterHBox(_session);
226 editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
227 editor_meter->clear_meters();
228 editor_meter->set_meter_type (_session->master_out()->meter_type());
229 editor_meter->setup_meters (30, 10, 6);
230 editor_meter->show();
231 meter_box.pack_start(*editor_meter);
233 editor_meter->ButtonPress.connect_same_thread (editor_meter_connection, boost::bind (&ARDOUR_UI::editor_meter_button_press, this, _1));
236 ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
237 ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
238 ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
240 editor_meter_peak_display.set_name ("meterbridge peakindicator");
241 editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
242 editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * UIConfiguration::instance().get_ui_scale())), -1);
243 editor_meter_peak_display.set_corner_radius (3.0);
245 editor_meter_max_peak = -INFINITY;
246 editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
248 repack_transport_hbox ();
255 ARDOUR_UI::unload_session (bool hide_stuff)
258 ARDOUR_UI::instance()->video_timeline->sync_session_state();
261 if (_session && _session->dirty()) {
262 std::vector<std::string> actions;
263 actions.push_back (_("Don't close"));
264 actions.push_back (_("Just close"));
265 actions.push_back (_("Save and close"));
266 switch (ask_about_saving_session (actions)) {
272 _session->save_state ("");
278 // tear down session specific CPI (owned by rc_config_editor which can remain)
279 ControlProtocolManager& m = ControlProtocolManager::instance ();
280 for (std::list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
281 if (*i && (*i)->protocol && (*i)->protocol->has_editor ()) {
282 (*i)->protocol->tear_down_gui ();
288 close_all_dialogs ();
291 meterbridge->hide ();
292 audio_port_matrix->hide();
293 midi_port_matrix->hide();
294 route_params->hide();
297 second_connection.disconnect ();
298 point_one_second_connection.disconnect ();
299 point_zero_something_second_connection.disconnect();
300 fps_connection.disconnect();
303 meter_box.remove(*editor_meter);
306 editor_meter_peak_display.hide();
309 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
311 rec_button.set_sensitive (false);
313 WM::Manager::instance().set_session ((ARDOUR::Session*) 0);
315 if (ARDOUR_UI::instance()->video_timeline) {
316 ARDOUR_UI::instance()->video_timeline->close_session();
321 /* drop everything attached to the blink signal */
323 blink_connection.disconnect ();
328 session_loaded = false;
330 update_buffer_load ();
337 ARDOUR_UI::toggle_editor_and_mixer ()
339 if (editor->tabbed() && mixer->tabbed()) {
340 /* both in the same window */
341 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
342 _tabs.set_current_page (_tabs.page_num (mixer->contents()));
343 } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
344 _tabs.set_current_page (_tabs.page_num (editor->contents()));
347 _tabs.set_current_page (_tabs.page_num (mixer->contents()));
353 if (editor->tabbed() && !mixer->tabbed()) {
354 /* editor is tabbed, mixer is not */
356 Gtk::Window* mwin = mixer->current_toplevel ();
359 /* mixer's own window doesn't exist */
360 mixer->make_visible ();
361 } else if (!mwin->is_mapped ()) {
362 /* mixer's own window exists but isn't mapped */
363 mixer->make_visible ();
365 /* mixer window is mapped, editor is visible as tab */
366 Gtk::Widget* f = mwin->get_focus();
367 if (f && f->has_focus()) {
368 /* mixer has focus, switch to editor */
369 editor->make_visible ();
371 mixer->make_visible ();
377 if (!editor->tabbed() && mixer->tabbed()) {
378 /* mixer is tabbed, editor is not */
380 Gtk::Window* ewin = editor->current_toplevel ();
383 /* mixer's own window doesn't exist */
384 editor->make_visible ();
385 } else if (!ewin->is_mapped ()) {
386 /* editor's own window exists but isn't mapped */
387 editor->make_visible ();
389 /* editor window is mapped, mixer is visible as tab */
390 Gtk::Widget* f = ewin->get_focus();
391 if (f && f->has_focus()) {
392 /* editor has focus, switch to mixer */
393 mixer->make_visible ();
395 editor->make_visible ();
403 ARDOUR_UI::step_up_through_tabs ()
405 std::vector<Tabbable*> candidates;
407 /* this list must match the order of visibility buttons */
409 if (!editor->window_visible()) {
410 candidates.push_back (editor);
413 if (!mixer->window_visible()) {
414 candidates.push_back (mixer);
417 if (!rc_option_editor->window_visible()) {
418 candidates.push_back (rc_option_editor);
421 if (candidates.size() < 2) {
422 /* nothing to be done with zero or one visible in tabs */
426 std::vector<Tabbable*>::iterator prev = candidates.end();
427 std::vector<Tabbable*>::iterator i;
428 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
430 for (i = candidates.begin(); i != candidates.end(); ++i) {
431 if (w == &(*i)->contents()) {
432 if (prev != candidates.end()) {
433 _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
435 _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
444 ARDOUR_UI::step_down_through_tabs ()
446 std::vector<Tabbable*> candidates;
448 /* this list must match the order of visibility buttons */
450 if (!editor->window_visible()) {
451 candidates.push_back (editor);
454 if (!mixer->window_visible()) {
455 candidates.push_back (mixer);
458 if (!rc_option_editor->window_visible()) {
459 candidates.push_back (rc_option_editor);
462 if (candidates.size() < 2) {
463 /* nothing to be done with zero or one visible in tabs */
467 std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
468 std::vector<Tabbable*>::reverse_iterator i;
469 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
471 for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
472 if (w == &(*i)->contents()) {
473 if (next != candidates.rend()) {
474 _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
476 _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
485 ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
492 _tabs.set_current_page (_tabs.page_num (t->contents()));
493 } else if (!t->fully_visible()) {
496 _main_window.present ();
501 ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
503 /* For many/most users, clicking a button in the main window will make it
504 the main/front/key window, which will change any stacking relationship they
505 were trying to modify by clicking on the button in the first
506 place. This button-aware method knows that click on
507 a button designed to show/hide a Tabbable that has its own window
508 will have made that window be obscured (as the main window comes to
509 the front). We therefore *hide* the Tabbable's window if it is even
510 partially visible, believing that this is likely because the
511 Tabbable window used to be front, the user clicked to change that,
512 and before we even get here, the main window has become front.
520 _tabs.set_current_page (_tabs.page_num (t->contents()));
521 } else if (t->visible()) {
529 ARDOUR_UI::show_tabbable (Tabbable* t)
539 ARDOUR_UI::hide_tabbable (Tabbable* t)
544 t->make_invisible ();
548 ARDOUR_UI::attach_tabbable (Tabbable* t)
558 ARDOUR_UI::detach_tabbable (Tabbable* t)
567 ARDOUR_UI::tabs_page_added (Widget*,guint)
569 if (_tabs.get_n_pages() > 1) {
571 std::vector<TargetEntry> drag_target_entries;
572 drag_target_entries.push_back (TargetEntry ("tabbable"));
574 editor_visibility_button.drag_source_set (drag_target_entries);
575 mixer_visibility_button.drag_source_set (drag_target_entries);
576 prefs_visibility_button.drag_source_set (drag_target_entries);
578 editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
579 Pango::FontDescription ("Sans 24"),
581 Gdk::Color ("red")));
582 mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
583 Pango::FontDescription ("Sans 24"),
585 Gdk::Color ("red")));
586 prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
587 Pango::FontDescription ("Sans 24"),
589 Gdk::Color ("red")));
594 ARDOUR_UI::tabs_page_removed (Widget*, guint)
596 if (_tabs.get_n_pages() < 2) {
597 editor_visibility_button.drag_source_unset ();
598 mixer_visibility_button.drag_source_unset ();
599 prefs_visibility_button.drag_source_unset ();
604 ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
606 if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
607 editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
609 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
610 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
613 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
614 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
616 } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
618 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
619 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
622 mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
624 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
625 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
628 } else if (page == (guint) _tabs.page_num (rc_option_editor->contents())) {
630 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
631 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
634 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
635 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
638 prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
644 ARDOUR_UI::tabbable_state_change (Tabbable& t)
646 std::vector<std::string> insensitive_action_names;
647 std::vector<std::string> sensitive_action_names;
648 std::vector<std::string> active_action_names;
649 std::vector<std::string> inactive_action_names;
650 Glib::RefPtr<Action> action;
651 std::string downcased_name = downcase (t.name());
661 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
662 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
663 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
664 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
668 } else if (t.tabbed_by_default ()) {
670 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
671 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
672 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
673 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
677 } else if (t.window_visible()) {
679 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
680 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
681 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
682 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
684 active_action_names.push_back (string_compose ("show-%1", downcased_name));
685 inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
691 /* not currently visible. allow user to retab it or just make
695 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
696 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
697 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
698 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
700 active_action_names.push_back (string_compose ("hide-%1", downcased_name));
701 inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
706 for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
707 action = ActionManager::get_action (X_("Common"), (*s).c_str());
709 action->set_sensitive (false);
713 for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
714 action = ActionManager::get_action (X_("Common"), (*s).c_str());
716 action->set_sensitive (true);
720 ArdourButton* vis_button = 0;
721 std::vector<ArdourButton*> other_vis_buttons;
724 vis_button = &editor_visibility_button;
725 other_vis_buttons.push_back (&mixer_visibility_button);
726 other_vis_buttons.push_back (&prefs_visibility_button);
727 } else if (&t == mixer) {
728 vis_button = &mixer_visibility_button;
729 other_vis_buttons.push_back (&editor_visibility_button);
730 other_vis_buttons.push_back (&prefs_visibility_button);
731 } else if (&t == rc_option_editor) {
732 vis_button = &prefs_visibility_button;
733 other_vis_buttons.push_back (&editor_visibility_button);
734 other_vis_buttons.push_back (&mixer_visibility_button);
743 vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
746 vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
749 vis_button->set_active_state (Gtkmm2ext::Off);
753 for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
754 (*b)->set_active_state (Gtkmm2ext::Off);
759 ARDOUR_UI::toggle_meterbridge ()
761 assert (editor && mixer && meterbridge);
764 bool obscuring = false;
766 if (meterbridge->not_visible ()) {
768 } else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
769 (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
773 if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
774 (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
779 meterbridge->show_window ();
780 meterbridge->present ();
781 meterbridge->raise ();
783 meterbridge->hide_window (NULL);
788 ARDOUR_UI::toggle_luawindow ()
790 assert (editor && luawindow);
794 if (luawindow->not_visible ()) {
797 // TODO check overlap
800 luawindow->show_window ();
801 luawindow->present ();
804 luawindow->hide_window (NULL);
810 ARDOUR_UI::new_midi_tracer_window ()
812 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
817 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
818 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
822 if (i == _midi_tracer_windows.end()) {
823 /* all our MIDITracer windows are visible; make a new one */
824 MidiTracer* t = new MidiTracer ();
826 _midi_tracer_windows.push_back (t);
828 /* re-use the hidden one */
834 ARDOUR_UI::create_key_editor ()
836 KeyEditor* kedit = new KeyEditor;
838 for (std::list<Bindings*>::iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
839 kedit->add_tab ((*b)->name(), **b);
846 ARDOUR_UI::create_bundle_manager ()
848 return new BundleManager (_session);
852 ARDOUR_UI::create_add_video_dialog ()
854 return new AddVideoDialog (_session);
858 ARDOUR_UI::create_session_option_editor ()
860 return new SessionOptionEditor (_session);
864 ARDOUR_UI::create_big_clock_window ()
866 return new BigClockWindow (*big_clock);
870 ARDOUR_UI::handle_locations_change (Location *)
873 if (_session->locations()->num_range_markers()) {
874 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
876 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
882 ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
884 if (object == editor) {
886 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
887 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
888 if (big_clock_window) {
889 big_clock_window->set_transient_for (*editor->own_window());
893 } else if (object == mixer) {
895 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
896 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
897 if (big_clock_window) {
898 big_clock_window->set_transient_for (*mixer->own_window());
907 ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
909 if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
910 ArdourMeter::ResetAllPeakDisplays ();
911 } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
912 if (_session->master_out()) {
913 ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
915 } else if (_session->master_out()) {
916 ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
922 ARDOUR_UI::toggle_mixer_space()
924 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMaximalMixer");
927 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
928 if (tact->get_active()) {
929 mixer->maximise_mixer_space ();
931 mixer->restore_mixer_space ();
937 ARDOUR_UI::toggle_mixer_list()
939 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixerList");
942 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
943 mixer->show_mixer_list (tact->get_active());
948 ARDOUR_UI::toggle_monitor_section_visibility ()
950 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
953 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
954 mixer->show_monitor_section (tact->get_active());