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 "midi_tracer.h"
59 #include "public_editor.h"
60 #include "rc_option_editor.h"
61 #include "route_params_ui.h"
62 #include "shuttle_control.h"
63 #include "session_option_editor.h"
64 #include "speaker_dialog.h"
67 #include "theme_manager.h"
68 #include "time_info_box.h"
73 using namespace ARDOUR;
77 using namespace Gtkmm2ext;
80 ARDOUR_UI::set_session (Session *s)
82 SessionHandlePtr::set_session (s);
85 WM::Manager::instance().set_session (s);
86 /* Session option editor cannot exist across change-of-session */
87 session_option_editor.drop_window ();
88 /* Ditto for AddVideoDialog */
89 add_video_dialog.drop_window ();
93 const XMLNode* node = _session->extra_xml (X_("UI"));
96 const XMLNodeList& children = node->children();
97 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
98 if ((*i)->name() == GUIObjectState::xml_node_name) {
99 gui_object_state->load (**i);
105 WM::Manager::instance().set_session (s);
107 AutomationWatch::instance().set_session (s);
110 shuttle_box->set_session (s);
113 primary_clock->set_session (s);
114 secondary_clock->set_session (s);
115 big_clock->set_session (s);
116 time_info_box->set_session (s);
117 video_timeline->set_session (s);
119 /* sensitize menu bar options that are now valid */
121 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
122 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
124 if (_session->locations()->num_range_markers()) {
125 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
127 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
130 if (!_session->monitor_out()) {
131 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
133 act->set_sensitive (false);
137 /* allow wastebasket flush again */
139 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
141 act->set_sensitive (true);
144 /* there are never any selections on startup */
146 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
147 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
148 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
149 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
150 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
152 rec_button.set_sensitive (true);
154 solo_alert_button.set_active (_session->soloing());
156 setup_session_options ();
158 blink_connection = Timers::blink_connect (sigc::mem_fun(*this, &ARDOUR_UI::blink_handler));
160 _session->SaveSessionRequested.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::save_session_at_its_request, this, _1), gui_context());
161 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
162 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
163 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
164 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
166 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
167 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
168 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
169 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
170 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
171 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
173 /* Clocks are on by default after we are connected to a session, so show that here.
176 connect_dependents_to_session (s);
178 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
179 restore their modes or are explicitly set, we will cause the "new" mode to be saved
180 back to the session XML ("Extra") state.
183 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
185 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
189 map_transport_state ();
191 second_connection = Timers::second_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second));
192 point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds));
193 point_zero_something_second_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds));
194 set_fps_timeout_connection();
198 if (meter_box.get_parent()) {
199 transport_hbox.remove (meter_box);
200 transport_hbox.remove (editor_meter_peak_display);
204 meter_box.remove(*editor_meter);
207 editor_meter_peak_display.hide();
210 if (meter_box.get_parent()) {
211 transport_hbox.remove (meter_box);
212 transport_hbox.remove (editor_meter_peak_display);
216 _session->master_out() &&
217 _session->master_out()->n_outputs().n(DataType::AUDIO) > 0) {
219 if (!ARDOUR::Profile->get_trx()) {
220 editor_meter = new LevelMeterHBox(_session);
221 editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
222 editor_meter->clear_meters();
223 editor_meter->set_type (_session->master_out()->meter_type());
224 editor_meter->setup_meters (30, 12, 6);
225 editor_meter->show();
226 meter_box.pack_start(*editor_meter);
229 ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
230 ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
231 ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
233 editor_meter_peak_display.set_name ("meterbridge peakindicator");
234 editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
235 editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * UIConfiguration::instance().get_ui_scale())), -1);
236 editor_meter_peak_display.set_corner_radius (3.0);
238 editor_meter_max_peak = -INFINITY;
239 editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
241 if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
242 transport_hbox.pack_start (meter_box, false, false);
243 transport_hbox.pack_start (editor_meter_peak_display, false, false);
245 editor_meter_peak_display.show();
253 ARDOUR_UI::unload_session (bool hide_stuff)
256 ARDOUR_UI::instance()->video_timeline->sync_session_state();
259 if (_session && _session->dirty()) {
260 std::vector<std::string> actions;
261 actions.push_back (_("Don't close"));
262 actions.push_back (_("Just close"));
263 actions.push_back (_("Save and close"));
264 switch (ask_about_saving_session (actions)) {
270 _session->save_state ("");
276 // tear down session specific CPI (owned by rc_config_editor which can remain)
277 ControlProtocolManager& m = ControlProtocolManager::instance ();
278 for (std::list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
279 if (*i && (*i)->protocol && (*i)->protocol->has_editor ()) {
280 (*i)->protocol->tear_down_gui ();
288 meterbridge->hide ();
289 audio_port_matrix->hide();
290 midi_port_matrix->hide();
291 route_params->hide();
294 second_connection.disconnect ();
295 point_one_second_connection.disconnect ();
296 point_zero_something_second_connection.disconnect();
297 fps_connection.disconnect();
300 meter_box.remove(*editor_meter);
303 editor_meter_peak_display.hide();
306 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
308 rec_button.set_sensitive (false);
310 WM::Manager::instance().set_session ((ARDOUR::Session*) 0);
312 if (ARDOUR_UI::instance()->video_timeline) {
313 ARDOUR_UI::instance()->video_timeline->close_session();
318 /* drop everything attached to the blink signal */
320 blink_connection.disconnect ();
325 session_loaded = false;
327 update_buffer_load ();
334 ARDOUR_UI::toggle_editor_and_mixer ()
336 if (editor->tabbed() && mixer->tabbed()) {
337 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
338 _tabs.set_current_page (_tabs.page_num (mixer->contents()));
339 } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
340 _tabs.set_current_page (_tabs.page_num (editor->contents()));
347 if (editor->tabbed() && !mixer->tabbed()) {
348 if (!editor->fully_visible()) {
349 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
350 mixer->make_visible ();
353 _main_window.present ();
358 if (mixer->tabbed () && !editor->tabbed()) {
359 if (!editor->fully_visible()) {
360 if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
361 editor->make_visible ();
364 _main_window.present ();
369 if (editor->fully_visible()) {
370 mixer->make_visible ();
372 editor->make_visible ();
377 ARDOUR_UI::step_up_through_tabs ()
379 std::vector<Tabbable*> candidates;
381 /* this list must match the order of visibility buttons */
383 if (!editor->window_visible()) {
384 candidates.push_back (editor);
387 if (!mixer->window_visible()) {
388 candidates.push_back (mixer);
391 if (!rc_option_editor->window_visible()) {
392 candidates.push_back (rc_option_editor);
395 if (candidates.size() < 2) {
396 /* nothing to be done with zero or one visible in tabs */
400 std::vector<Tabbable*>::iterator prev = candidates.end();
401 std::vector<Tabbable*>::iterator i;
402 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
404 for (i = candidates.begin(); i != candidates.end(); ++i) {
405 if (w == &(*i)->contents()) {
406 if (prev != candidates.end()) {
407 _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
409 _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
418 ARDOUR_UI::step_down_through_tabs ()
420 std::vector<Tabbable*> candidates;
422 /* this list must match the order of visibility buttons */
424 if (!editor->window_visible()) {
425 candidates.push_back (editor);
428 if (!mixer->window_visible()) {
429 candidates.push_back (mixer);
432 if (!rc_option_editor->window_visible()) {
433 candidates.push_back (rc_option_editor);
436 if (candidates.size() < 2) {
437 /* nothing to be done with zero or one visible in tabs */
441 std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
442 std::vector<Tabbable*>::reverse_iterator i;
443 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
445 for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
446 if (w == &(*i)->contents()) {
447 if (next != candidates.rend()) {
448 _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
450 _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
459 ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
466 _tabs.set_current_page (_tabs.page_num (t->contents()));
467 } else if (!t->fully_visible()) {
470 _main_window.present ();
475 ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
477 /* For many/most users, clicking a button in the main window will make it
478 the main/front/key window, which will change any stacking relationship they
479 were trying to modify by clicking on the button in the first
480 place. This button-aware method knows that click on
481 a button designed to show/hide a Tabbable that has its own window
482 will have made that window be obscured (as the main window comes to
483 the front). We therefore *hide* the Tabbable's window if it is even
484 partially visible, believing that this is likely because the
485 Tabbable window used to be front, the user clicked to change that,
486 and before we even get here, the main window has become front.
494 _tabs.set_current_page (_tabs.page_num (t->contents()));
495 } else if (t->visible()) {
503 ARDOUR_UI::show_tabbable (Tabbable* t)
513 ARDOUR_UI::hide_tabbable (Tabbable* t)
518 t->make_invisible ();
522 ARDOUR_UI::attach_tabbable (Tabbable* t)
532 ARDOUR_UI::detach_tabbable (Tabbable* t)
541 ARDOUR_UI::tabs_page_added (Widget*,guint)
543 if (_tabs.get_n_pages() > 1) {
545 std::vector<TargetEntry> drag_target_entries;
546 drag_target_entries.push_back (TargetEntry ("tabbable"));
548 editor_visibility_button.drag_source_set (drag_target_entries);
549 mixer_visibility_button.drag_source_set (drag_target_entries);
550 prefs_visibility_button.drag_source_set (drag_target_entries);
552 editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
553 Pango::FontDescription ("Sans 24"),
555 Gdk::Color ("red")));
556 mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
557 Pango::FontDescription ("Sans 24"),
559 Gdk::Color ("red")));
560 prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
561 Pango::FontDescription ("Sans 24"),
563 Gdk::Color ("red")));
568 ARDOUR_UI::tabs_page_removed (Widget*, guint)
570 if (_tabs.get_n_pages() < 2) {
571 editor_visibility_button.drag_source_unset ();
572 mixer_visibility_button.drag_source_unset ();
573 prefs_visibility_button.drag_source_unset ();
578 ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
580 if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
581 editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
582 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
583 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
585 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
586 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
588 } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
589 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
590 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
592 mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
594 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
595 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
598 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
599 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
601 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
602 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
604 prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
610 ARDOUR_UI::tabbable_state_change (Tabbable& t)
612 std::vector<std::string> insensitive_action_names;
613 std::vector<std::string> sensitive_action_names;
614 std::vector<std::string> active_action_names;
615 std::vector<std::string> inactive_action_names;
616 Glib::RefPtr<Action> action;
617 std::string downcased_name = downcase (t.name());
627 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
628 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
629 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
630 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
634 } else if (t.tabbed_by_default ()) {
636 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
637 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
638 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
639 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
643 } else if (t.window_visible()) {
645 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
646 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
647 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
648 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
650 active_action_names.push_back (string_compose ("show-%1", downcased_name));
651 inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
657 /* not currently visible. allow user to retab it or just make
661 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
662 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
663 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
664 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
666 active_action_names.push_back (string_compose ("hide-%1", downcased_name));
667 inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
672 for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
673 action = ActionManager::get_action (X_("Common"), (*s).c_str());
675 action->set_sensitive (false);
679 for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
680 action = ActionManager::get_action (X_("Common"), (*s).c_str());
682 action->set_sensitive (true);
686 ArdourButton* vis_button = 0;
687 std::vector<ArdourButton*> other_vis_buttons;
690 vis_button = &editor_visibility_button;
691 other_vis_buttons.push_back (&mixer_visibility_button);
692 other_vis_buttons.push_back (&prefs_visibility_button);
693 } else if (&t == mixer) {
694 vis_button = &mixer_visibility_button;
695 other_vis_buttons.push_back (&editor_visibility_button);
696 other_vis_buttons.push_back (&prefs_visibility_button);
698 vis_button = &prefs_visibility_button;
699 other_vis_buttons.push_back (&editor_visibility_button);
700 other_vis_buttons.push_back (&mixer_visibility_button);
709 vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
712 vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
715 vis_button->set_active_state (Gtkmm2ext::Off);
719 for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
720 (*b)->set_active_state (Gtkmm2ext::Off);
725 ARDOUR_UI::toggle_meterbridge ()
727 assert (editor && mixer && meterbridge);
730 bool obscuring = false;
732 if (meterbridge->not_visible ()) {
734 } else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
735 (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
739 if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
740 (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
745 meterbridge->show_window ();
746 meterbridge->present ();
747 meterbridge->raise ();
749 meterbridge->hide_window (NULL);
754 ARDOUR_UI::toggle_luawindow ()
756 assert (editor && luawindow);
759 bool obscuring = false;
761 if (luawindow->not_visible ()) {
764 // TODO check overlap
767 luawindow->show_window ();
768 luawindow->present ();
771 luawindow->hide_window (NULL);
777 ARDOUR_UI::new_midi_tracer_window ()
779 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
784 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
785 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
789 if (i == _midi_tracer_windows.end()) {
790 /* all our MIDITracer windows are visible; make a new one */
791 MidiTracer* t = new MidiTracer ();
793 _midi_tracer_windows.push_back (t);
795 /* re-use the hidden one */
801 ARDOUR_UI::create_key_editor ()
803 KeyEditor* kedit = new KeyEditor;
805 if (global_bindings) {
806 kedit->add_tab (_("Global"), *global_bindings);
809 if (editor->bindings) {
810 kedit->add_tab (_("Editing"), *editor->bindings);
813 if (mixer->bindings) {
814 kedit->add_tab (_("Mixing"), *mixer->bindings);
821 ARDOUR_UI::create_bundle_manager ()
823 return new BundleManager (_session);
827 ARDOUR_UI::create_add_video_dialog ()
829 return new AddVideoDialog (_session);
833 ARDOUR_UI::create_session_option_editor ()
835 return new SessionOptionEditor (_session);
839 ARDOUR_UI::create_big_clock_window ()
841 return new BigClockWindow (*big_clock);
845 ARDOUR_UI::handle_locations_change (Location *)
848 if (_session->locations()->num_range_markers()) {
849 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
851 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
857 ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
859 if (object == editor) {
861 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
862 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
863 if (big_clock_window) {
864 big_clock_window->set_transient_for (*editor->own_window());
868 } else if (object == mixer) {
870 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
871 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
872 if (big_clock_window) {
873 big_clock_window->set_transient_for (*mixer->own_window());
882 ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
884 if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
885 ArdourMeter::ResetAllPeakDisplays ();
886 } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
887 if (_session->master_out()) {
888 ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
890 } else if (_session->master_out()) {
891 ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
897 ARDOUR_UI::toggle_mixer_space()
899 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMaximalMixer");
902 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
903 if (tact->get_active()) {
904 mixer->maximise_mixer_space ();
906 mixer->restore_mixer_space ();
912 ARDOUR_UI::toggle_mixer_list()
914 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixerList");
917 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
918 mixer->show_mixer_list (tact->get_active());
923 ARDOUR_UI::toggle_monitor_section_visibility ()
925 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
928 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
929 mixer->show_monitor_section (tact->get_active());
934 ARDOUR_UI::lua_script_manager ()
936 lua_script_window.show ();