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 "luawindow.h"
53 #include "main_clock.h"
54 #include "meterbridge.h"
55 #include "meter_patterns.h"
56 #include "midi_tracer.h"
58 #include "public_editor.h"
59 #include "rc_option_editor.h"
60 #include "route_params_ui.h"
61 #include "shuttle_control.h"
62 #include "session_option_editor.h"
63 #include "speaker_dialog.h"
66 #include "theme_manager.h"
67 #include "time_info_box.h"
72 using namespace ARDOUR;
76 using namespace Gtkmm2ext;
79 ARDOUR_UI::set_session (Session *s)
81 SessionHandlePtr::set_session (s);
84 WM::Manager::instance().set_session (s);
85 /* Session option editor cannot exist across change-of-session */
86 session_option_editor.drop_window ();
87 /* Ditto for AddVideoDialog */
88 add_video_dialog.drop_window ();
92 const XMLNode* node = _session->extra_xml (X_("UI"));
95 const XMLNodeList& children = node->children();
96 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
97 if ((*i)->name() == GUIObjectState::xml_node_name) {
98 gui_object_state->load (**i);
104 WM::Manager::instance().set_session (s);
106 AutomationWatch::instance().set_session (s);
109 shuttle_box->set_session (s);
112 primary_clock->set_session (s);
113 secondary_clock->set_session (s);
114 big_clock->set_session (s);
115 time_info_box->set_session (s);
116 video_timeline->set_session (s);
118 /* sensitize menu bar options that are now valid */
120 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
121 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
123 if (_session->locations()->num_range_markers()) {
124 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
126 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
129 if (!_session->monitor_out()) {
130 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
132 act->set_sensitive (false);
136 /* allow wastebasket flush again */
138 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
140 act->set_sensitive (true);
143 /* there are never any selections on startup */
145 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
146 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
147 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
148 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
149 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
151 rec_button.set_sensitive (true);
153 solo_alert_button.set_active (_session->soloing());
155 setup_session_options ();
157 blink_connection = Timers::blink_connect (sigc::mem_fun(*this, &ARDOUR_UI::blink_handler));
159 _session->SaveSessionRequested.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::save_session_at_its_request, this, _1), gui_context());
160 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
161 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
162 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
163 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
165 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
166 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
167 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
168 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
169 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
170 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
172 /* Clocks are on by default after we are connected to a session, so show that here.
175 connect_dependents_to_session (s);
177 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
178 restore their modes or are explicitly set, we will cause the "new" mode to be saved
179 back to the session XML ("Extra") state.
182 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
184 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
188 map_transport_state ();
190 second_connection = Timers::second_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second));
191 point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds));
192 point_zero_something_second_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds));
193 set_fps_timeout_connection();
197 if (meter_box.get_parent()) {
198 transport_hbox.remove (meter_box);
199 transport_hbox.remove (editor_meter_peak_display);
203 meter_box.remove(*editor_meter);
206 editor_meter_peak_display.hide();
209 if (meter_box.get_parent()) {
210 transport_hbox.remove (meter_box);
211 transport_hbox.remove (editor_meter_peak_display);
215 _session->master_out() &&
216 _session->master_out()->n_outputs().n(DataType::AUDIO) > 0) {
218 if (!ARDOUR::Profile->get_trx()) {
219 editor_meter = new LevelMeterHBox(_session);
220 editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
221 editor_meter->clear_meters();
222 editor_meter->set_type (_session->master_out()->meter_type());
223 editor_meter->setup_meters (30, 12, 6);
224 editor_meter->show();
225 meter_box.pack_start(*editor_meter);
228 ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
229 ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
230 ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
232 editor_meter_peak_display.set_name ("meterbridge peakindicator");
233 editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
234 editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * UIConfiguration::instance().get_ui_scale())), -1);
235 editor_meter_peak_display.set_corner_radius (3.0);
237 editor_meter_max_peak = -INFINITY;
238 editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
240 if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
241 transport_hbox.pack_start (meter_box, false, false);
242 transport_hbox.pack_start (editor_meter_peak_display, false, false);
244 editor_meter_peak_display.show();
252 ARDOUR_UI::unload_session (bool hide_stuff)
255 ARDOUR_UI::instance()->video_timeline->sync_session_state();
258 if (_session && _session->dirty()) {
259 std::vector<std::string> actions;
260 actions.push_back (_("Don't close"));
261 actions.push_back (_("Just close"));
262 actions.push_back (_("Save and close"));
263 switch (ask_about_saving_session (actions)) {
269 _session->save_state ("");
275 // tear down session specific CPI (owned by rc_config_editor which can remain)
276 ControlProtocolManager& m = ControlProtocolManager::instance ();
277 for (std::list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
278 if (*i && (*i)->protocol && (*i)->protocol->has_editor ()) {
279 (*i)->protocol->tear_down_gui ();
287 meterbridge->hide ();
288 audio_port_matrix->hide();
289 midi_port_matrix->hide();
290 route_params->hide();
293 second_connection.disconnect ();
294 point_one_second_connection.disconnect ();
295 point_zero_something_second_connection.disconnect();
296 fps_connection.disconnect();
299 meter_box.remove(*editor_meter);
302 editor_meter_peak_display.hide();
305 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
307 rec_button.set_sensitive (false);
309 WM::Manager::instance().set_session ((ARDOUR::Session*) 0);
311 if (ARDOUR_UI::instance()->video_timeline) {
312 ARDOUR_UI::instance()->video_timeline->close_session();
317 /* drop everything attached to the blink signal */
319 blink_connection.disconnect ();
324 session_loaded = false;
326 update_buffer_load ();
333 ARDOUR_UI::toggle_editor_and_mixer ()
335 if (editor->tabbed() && mixer->tabbed()) {
336 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
337 _tabs.set_current_page (_tabs.page_num (mixer->contents()));
338 } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
339 _tabs.set_current_page (_tabs.page_num (editor->contents()));
346 if (editor->tabbed() && !mixer->tabbed()) {
347 if (!editor->fully_visible()) {
348 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
349 mixer->make_visible ();
352 _main_window.present ();
357 if (mixer->tabbed () && !editor->tabbed()) {
358 if (!editor->fully_visible()) {
359 if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
360 editor->make_visible ();
363 _main_window.present ();
368 if (editor->fully_visible()) {
369 mixer->make_visible ();
371 editor->make_visible ();
376 ARDOUR_UI::step_up_through_tabs ()
378 std::vector<Tabbable*> candidates;
380 /* this list must match the order of visibility buttons */
382 if (!editor->window_visible()) {
383 candidates.push_back (editor);
386 if (!mixer->window_visible()) {
387 candidates.push_back (mixer);
390 if (!rc_option_editor->window_visible()) {
391 candidates.push_back (rc_option_editor);
394 if (candidates.size() < 2) {
395 /* nothing to be done with zero or one visible in tabs */
399 std::vector<Tabbable*>::iterator prev = candidates.end();
400 std::vector<Tabbable*>::iterator i;
401 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
403 for (i = candidates.begin(); i != candidates.end(); ++i) {
404 if (w == &(*i)->contents()) {
405 if (prev != candidates.end()) {
406 _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
408 _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
417 ARDOUR_UI::step_down_through_tabs ()
419 std::vector<Tabbable*> candidates;
421 /* this list must match the order of visibility buttons */
423 if (!editor->window_visible()) {
424 candidates.push_back (editor);
427 if (!mixer->window_visible()) {
428 candidates.push_back (mixer);
431 if (!rc_option_editor->window_visible()) {
432 candidates.push_back (rc_option_editor);
435 if (candidates.size() < 2) {
436 /* nothing to be done with zero or one visible in tabs */
440 std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
441 std::vector<Tabbable*>::reverse_iterator i;
442 Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
444 for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
445 if (w == &(*i)->contents()) {
446 if (next != candidates.rend()) {
447 _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
449 _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
458 ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
465 _tabs.set_current_page (_tabs.page_num (t->contents()));
466 } else if (!t->fully_visible()) {
469 _main_window.present ();
474 ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
476 /* For many/most users, clicking a button in the main window will make it
477 the main/front/key window, which will change any stacking relationship they
478 were trying to modify by clicking on the button in the first
479 place. This button-aware method knows that click on
480 a button designed to show/hide a Tabbable that has its own window
481 will have made that window be obscured (as the main window comes to
482 the front). We therefore *hide* the Tabbable's window if it is even
483 partially visible, believing that this is likely because the
484 Tabbable window used to be front, the user clicked to change that,
485 and before we even get here, the main window has become front.
493 _tabs.set_current_page (_tabs.page_num (t->contents()));
494 } else if (t->visible()) {
502 ARDOUR_UI::show_tabbable (Tabbable* t)
512 ARDOUR_UI::hide_tabbable (Tabbable* t)
517 t->make_invisible ();
521 ARDOUR_UI::attach_tabbable (Tabbable* t)
531 ARDOUR_UI::detach_tabbable (Tabbable* t)
540 ARDOUR_UI::tabs_page_added (Widget*,guint)
542 if (_tabs.get_n_pages() > 1) {
544 std::vector<TargetEntry> drag_target_entries;
545 drag_target_entries.push_back (TargetEntry ("tabbable"));
547 editor_visibility_button.drag_source_set (drag_target_entries);
548 mixer_visibility_button.drag_source_set (drag_target_entries);
549 prefs_visibility_button.drag_source_set (drag_target_entries);
551 editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
552 Pango::FontDescription ("Sans 24"),
554 Gdk::Color ("red")));
555 mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
556 Pango::FontDescription ("Sans 24"),
558 Gdk::Color ("red")));
559 prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
560 Pango::FontDescription ("Sans 24"),
562 Gdk::Color ("red")));
567 ARDOUR_UI::tabs_page_removed (Widget*, guint)
569 if (_tabs.get_n_pages() < 2) {
570 editor_visibility_button.drag_source_unset ();
571 mixer_visibility_button.drag_source_unset ();
572 prefs_visibility_button.drag_source_unset ();
577 ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
579 if (page == (guint) _tabs.page_num (editor->contents())) {
580 editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
581 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
582 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
584 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
585 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
587 } else if (page == (guint) _tabs.page_num (mixer->contents())) {
588 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
589 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
591 mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
593 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
594 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
597 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
598 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
600 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
601 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
603 prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
609 ARDOUR_UI::tabbable_state_change (Tabbable& t)
611 std::vector<std::string> insensitive_action_names;
612 std::vector<std::string> sensitive_action_names;
613 std::vector<std::string> active_action_names;
614 std::vector<std::string> inactive_action_names;
615 Glib::RefPtr<Action> action;
616 std::string downcased_name = downcase (t.name());
626 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
627 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
628 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
629 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
633 } else if (t.tabbed_by_default ()) {
635 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
636 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
637 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
638 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
642 } else if (t.window_visible()) {
644 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
645 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
646 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
647 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
649 active_action_names.push_back (string_compose ("show-%1", downcased_name));
650 inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
656 /* not currently visible. allow user to retab it or just make
660 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
661 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
662 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
663 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
665 active_action_names.push_back (string_compose ("hide-%1", downcased_name));
666 inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
671 for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
672 action = ActionManager::get_action (X_("Common"), (*s).c_str());
674 action->set_sensitive (false);
678 for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
679 action = ActionManager::get_action (X_("Common"), (*s).c_str());
681 action->set_sensitive (true);
685 ArdourButton* vis_button = 0;
686 std::vector<ArdourButton*> other_vis_buttons;
689 vis_button = &editor_visibility_button;
690 other_vis_buttons.push_back (&mixer_visibility_button);
691 other_vis_buttons.push_back (&prefs_visibility_button);
692 } else if (&t == mixer) {
693 vis_button = &mixer_visibility_button;
694 other_vis_buttons.push_back (&editor_visibility_button);
695 other_vis_buttons.push_back (&prefs_visibility_button);
697 vis_button = &prefs_visibility_button;
698 other_vis_buttons.push_back (&editor_visibility_button);
699 other_vis_buttons.push_back (&mixer_visibility_button);
708 vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
711 vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
714 vis_button->set_active_state (Gtkmm2ext::Off);
718 for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
719 (*b)->set_active_state (Gtkmm2ext::Off);
724 ARDOUR_UI::toggle_meterbridge ()
726 assert (editor && mixer && meterbridge);
729 bool obscuring = false;
731 if (meterbridge->not_visible ()) {
733 } else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
734 (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
738 if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
739 (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
744 meterbridge->show_window ();
745 meterbridge->present ();
746 meterbridge->raise ();
748 meterbridge->hide_window (NULL);
753 ARDOUR_UI::toggle_luawindow ()
755 assert (editor && luawindow);
758 bool obscuring = false;
760 if (luawindow->not_visible ()) {
763 // TODO check overlap
766 luawindow->show_window ();
767 luawindow->present ();
770 luawindow->hide_window (NULL);
776 ARDOUR_UI::new_midi_tracer_window ()
778 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
783 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
784 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
788 if (i == _midi_tracer_windows.end()) {
789 /* all our MIDITracer windows are visible; make a new one */
790 MidiTracer* t = new MidiTracer ();
792 _midi_tracer_windows.push_back (t);
794 /* re-use the hidden one */
800 ARDOUR_UI::create_key_editor ()
802 KeyEditor* kedit = new KeyEditor;
804 if (global_bindings) {
805 kedit->add_tab (_("Global"), *global_bindings);
808 if (editor->bindings) {
809 kedit->add_tab (_("Editing"), *editor->bindings);
812 if (mixer->bindings) {
813 kedit->add_tab (_("Mixing"), *mixer->bindings);
820 ARDOUR_UI::create_bundle_manager ()
822 return new BundleManager (_session);
826 ARDOUR_UI::create_add_video_dialog ()
828 return new AddVideoDialog (_session);
832 ARDOUR_UI::create_session_option_editor ()
834 return new SessionOptionEditor (_session);
838 ARDOUR_UI::create_big_clock_window ()
840 return new BigClockWindow (*big_clock);
844 ARDOUR_UI::handle_locations_change (Location *)
847 if (_session->locations()->num_range_markers()) {
848 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
850 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
856 ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
858 if (object == editor) {
860 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
861 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
862 if (big_clock_window) {
863 big_clock_window->set_transient_for (*editor->own_window());
867 } else if (object == mixer) {
869 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
870 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
871 if (big_clock_window) {
872 big_clock_window->set_transient_for (*mixer->own_window());
881 ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
883 if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
884 ArdourMeter::ResetAllPeakDisplays ();
885 } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
886 if (_session->master_out()) {
887 ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
889 } else if (_session->master_out()) {
890 ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
896 ARDOUR_UI::toggle_mixer_space()
898 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMaximalMixer");
901 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
902 if (tact->get_active()) {
903 mixer->maximise_mixer_space ();
905 mixer->restore_mixer_space ();
911 ARDOUR_UI::toggle_mixer_list()
913 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixerList");
916 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
917 mixer->show_mixer_list (tact->get_active());
922 ARDOUR_UI::toggle_monitor_section_visibility ()
924 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
927 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
928 mixer->show_monitor_section (tact->get_active());
933 ARDOUR_UI::lua_script_manager ()
935 lua_script_window.show ();