X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui_dialogs.cc;h=859a1678327ee0797fad09fe06529b476e0f7bd7;hb=9e5b7db89f381c70232fab35dc21fd885863f998;hp=d1efb4d7def93dbf0454dc2c122025de23172848;hpb=0cd1db76f04cf2d15bd257763a92ecd92fa534ce;p=ardour.git diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index d1efb4d7de..859a167832 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -42,6 +42,7 @@ #include "keyeditor.h" #include "location_ui.h" #include "main_clock.h" +#include "meterbridge.h" #include "meter_patterns.h" #include "midi_tracer.h" #include "mixer_ui.h" @@ -203,8 +204,8 @@ ARDOUR_UI::set_session (Session *s) transport_tearoff_hbox.remove (editor_meter_peak_display); } - if (_session && - _session->master_out() && + if (_session && + _session->master_out() && _session->master_out()->n_outputs().n(DataType::AUDIO) > 0) { if (!ARDOUR::Profile->get_trx()) { @@ -223,13 +224,13 @@ ARDOUR_UI::set_session (Session *s) editor_meter_peak_display.set_name ("meterbridge peakindicator"); editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS); - editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * ui_scale)), -1); + editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * UIConfiguration::instance().get_ui_scale())), -1); editor_meter_peak_display.set_corner_radius (3.0); editor_meter_max_peak = -INFINITY; editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false); - if (ARDOUR_UI::config()->get_show_editor_meter() && !ARDOUR::Profile->get_trx()) { + if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) { transport_tearoff_hbox.pack_start (meter_box, false, false); transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false); meter_box.show(); @@ -336,7 +337,7 @@ ARDOUR_UI::goto_editor_window () editor->show_window (); editor->present (); /* mixer should now be on top */ - if (ARDOUR_UI::config()->get_transients_follow_front()) { + if (UIConfiguration::instance().get_transients_follow_front()) { WM::Manager::instance().set_transient_for (editor); } _mixer_on_top = false; @@ -347,7 +348,7 @@ ARDOUR_UI::goto_mixer_window () { Glib::RefPtr win; Glib::RefPtr screen; - + if (editor) { win = editor->get_window (); } @@ -357,7 +358,7 @@ ARDOUR_UI::goto_mixer_window () } else { screen = Gdk::Screen::get_default(); } - + if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) { Gtk::MessageDialog msg (_("This screen is not tall enough to display the mixer window")); msg.run (); @@ -367,7 +368,7 @@ ARDOUR_UI::goto_mixer_window () mixer->show_window (); mixer->present (); /* mixer should now be on top */ - if (ARDOUR_UI::config()->get_transients_follow_front()) { + if (UIConfiguration::instance().get_transients_follow_front()) { WM::Manager::instance().set_transient_for (mixer); } _mixer_on_top = true; @@ -376,14 +377,28 @@ ARDOUR_UI::goto_mixer_window () void ARDOUR_UI::toggle_mixer_window () { - Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("toggle-mixer")); - if (!act) { - return; + /* thse windows are created in ARDOUR_UI::setup_windows() + * it should be impossible to get here with any of them being NULL + */ + assert (editor && mixer && meterbridge); + + bool show = false; + bool obscuring = false; + + if (mixer->not_visible ()) { + show = true; + } + else if ( (!editor->not_visible () && ARDOUR_UI_UTILS::windows_overlap (editor, mixer)) + || (!meterbridge->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer)) + ) { + obscuring = true; } - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (obscuring && (editor->property_has_toplevel_focus() || meterbridge->property_has_toplevel_focus())) { + show = true; + } - if (tact->get_active()) { + if (show) { goto_mixer_window (); } else { mixer->hide (); @@ -393,19 +408,28 @@ ARDOUR_UI::toggle_mixer_window () void ARDOUR_UI::toggle_meterbridge () { - Glib::RefPtr act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge")); - if (!act) { - return; + assert (editor && mixer && meterbridge); + + bool show = false; + bool obscuring = false; + + if (meterbridge->not_visible ()) { + show = true; + } + else if ( (!editor->not_visible() && ARDOUR_UI_UTILS::windows_overlap (editor, meterbridge)) + || (!mixer->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer)) + ) { + obscuring = true; } - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (obscuring && (editor->property_has_toplevel_focus() || mixer->property_has_toplevel_focus())) { + show = true; + } - if (tact->get_active()) { + if (show) { meterbridge->show_window (); meterbridge->present (); - if (editor) { - meterbridge->set_transient_for (*editor); - } + meterbridge->raise (); } else { meterbridge->hide_window (NULL); } @@ -415,79 +439,37 @@ void ARDOUR_UI::toggle_editor_mixer () { bool obscuring = false; - /* currently, if windows are on different - screens then we do nothing; but in the - future we may want to bring the window - to the front or something, so I'm leaving this - variable for future use - */ - bool same_screen = true; - - if (editor && mixer) { - - /* remeber: Screen != Monitor (Screen is a separately rendered - * continuous geometry that make include 1 or more monitors. - */ - - if (editor->get_screen() != mixer->get_screen() && (mixer->get_screen() != 0) && (editor->get_screen() != 0)) { - // different screens, so don't do anything - same_screen = false; - } else { - // they are on the same screen, see if they are obscuring each other - - gint ex, ey, ew, eh; - gint mx, my, mw, mh; - - editor->get_position (ex, ey); - editor->get_size (ew, eh); - - mixer->get_position (mx, my); - mixer->get_size (mw, mh); - - GdkRectangle e; - GdkRectangle m; - GdkRectangle r; - - e.x = ex; - e.y = ey; - e.width = ew; - e.height = eh; - - m.x = mx; - m.y = my; - m.width = mw; - m.height = mh; - - if (gdk_rectangle_intersect (&e, &m, &r)) { - obscuring = true; - } - } - } - - if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) { - if (obscuring && same_screen) { - goto_editor_window(); - } - } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) { - if (obscuring && same_screen) { - goto_mixer_window(); - } - } else if (mixer && mixer->not_visible()) { - if (obscuring && same_screen) { - goto_mixer_window (); - } - } else if (editor && editor->not_visible()) { - if (obscuring && same_screen) { - goto_editor_window (); - } - } else if (obscuring && same_screen) { - //it's unclear what to do here, so just do the opposite of what we did last time (old behavior) - if (_mixer_on_top) { + + if (editor && mixer) { + if (ARDOUR_UI_UTILS::windows_overlap (editor, mixer)) { + obscuring = true; + } + } + + if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) { + if (obscuring) { + goto_editor_window(); + } + } else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) { + if (obscuring) { + goto_mixer_window(); + } + } else if (mixer && mixer->not_visible()) { + if (obscuring) { + goto_mixer_window (); + } + } else if (editor && editor->not_visible()) { + if (obscuring) { + goto_editor_window (); + } + } else if (obscuring) { + //it's unclear what to do here, so just do the opposite of what we did last time (old behavior) + if (_mixer_on_top) { goto_editor_window (); } else { goto_mixer_window (); } - } + } } void @@ -604,3 +586,25 @@ ARDOUR_UI::toggle_mixer_space() } } } + +void +ARDOUR_UI::toggle_mixer_list() +{ + Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMixerList"); + + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + mixer->show_mixer_list (tact->get_active()); + } +} + +void +ARDOUR_UI::toggle_monitor_section_visibility () +{ + Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); + + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + mixer->show_monitor_section (tact->get_active()); + } +}