diff options
Diffstat (limited to 'gtk2_ardour/ardour_ui_dialogs.cc')
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 133 |
1 files changed, 83 insertions, 50 deletions
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index d43d1dbec6..3ff625a207 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -95,7 +95,7 @@ ARDOUR_UI::set_session (Session *s) } AutomationWatch::instance().set_session (s); - WindowManager::instance().set_session (s); + WM::Manager::instance().set_session (s); if (shuttle_box) { shuttle_box->set_session (s); @@ -268,19 +268,21 @@ ARDOUR_UI::goto_editor_window () editor->show_window (); editor->present (); - flush_pending (); + /* mixer should now be on top */ + WM::Manager::instance().set_transient_for (editor); + _mixer_on_top = false; } void ARDOUR_UI::goto_mixer_window () { - if (!editor) { - return; - } - - Glib::RefPtr<Gdk::Window> win = editor->get_window (); + Glib::RefPtr<Gdk::Window> win; Glib::RefPtr<Gdk::Screen> screen; + if (editor) { + win = editor->get_window (); + } + if (win) { screen = win->get_screen(); } else { @@ -295,10 +297,11 @@ ARDOUR_UI::goto_mixer_window () mixer->show_window (); mixer->present (); - flush_pending (); + /* mixer should now be on top */ + WM::Manager::instance().set_transient_for (mixer); + _mixer_on_top = true; } - void ARDOUR_UI::toggle_mixer_window () { @@ -319,49 +322,80 @@ ARDOUR_UI::toggle_mixer_window () void ARDOUR_UI::toggle_editor_mixer () { - if (editor && mixer) { - - if (editor->get_screen() != mixer->get_screen()) { - // different screens, so don't do anything - return; - } - - /* 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; + 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) { - m.x = mx; - m.y = my; - m.width = mw; - m.height = mh; + /* remeber: Screen != Monitor (Screen is a separately rendered + * continuous geometry that make include 1 or more monitors. + */ - if (!gdk_rectangle_intersect (&e, &m, &r)) { - /* they do not intersect so do not toggle */ - return; + 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) { + goto_editor_window (); + } else { + goto_mixer_window (); } - } - - if (mixer && mixer->fully_visible()) { - goto_editor_window (); - } else { - goto_mixer_window (); - } + } } void @@ -380,7 +414,6 @@ ARDOUR_UI::new_midi_tracer_window () if (i == _midi_tracer_windows.end()) { /* all our MIDITracer windows are visible; make a new one */ MidiTracer* t = new MidiTracer (); - manage_window (*t); t->show_all (); _midi_tracer_windows.push_back (t); } else { |