diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-05-07 13:01:18 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-05-07 13:01:26 -0400 |
commit | a902737db97e6bdd55493a1536242a26e26a0014 (patch) | |
tree | 5aa1cc8abcd0d50bd5245414266dc6cbd6a236fa /gtk2_ardour | |
parent | e8301185c0391eafa18a09932bfeb1bd76b4bb04 (diff) |
various changes to window visibility mgmt, including use of the mixbus2 code for toggling editor + mixer windows. no longer attempt to track changes made outside of ardour, which is a lost cause
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 130 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 3 | ||||
-rw-r--r-- | gtk2_ardour/public_editor.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/public_editor.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/window_manager.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/window_manager.h | 3 |
9 files changed, 120 insertions, 56 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 1d08d65215..abf2d44145 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -146,8 +146,15 @@ sigc::signal<void> ARDOUR_UI::CloseAllDialogs; ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) : Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp) - + , gui_object_state (new GUIObjectState) + + , _startup (0) + , engine (0) + , nsm (0) + , _was_dirty (false) + , _mixer_on_top (false) + , primary_clock (new MainClock (X_("primary"), false, X_("transport"), true, true, true, false, true)) , secondary_clock (new MainClock (X_("secondary"), false, X_("secondary"), true, true, false, false, true)) @@ -197,7 +204,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) Gtkmm2ext::init(localedir); splash = 0; - _startup = 0; if (theArdourUI == 0) { theArdourUI = this; @@ -688,7 +694,6 @@ ARDOUR_UI::startup () app->ready (); nsm_url = getenv ("NSM_URL"); - nsm = 0; if (nsm_url) { nsm = new NSM_Client; diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index f2b2029170..4d624377c6 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -301,6 +301,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr Gtk::Tooltips _tooltips; NSM_Client *nsm; bool _was_dirty; + bool _mixer_on_top; void goto_editor_window (); void goto_mixer_window (); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 2e0d017d0c..ad469ff160 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -268,19 +268,21 @@ ARDOUR_UI::goto_editor_window () editor->show_window (); editor->present (); - flush_pending (); + /* mixer should now be on top */ + WindowManager::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 */ + WindowManager::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 diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 170a14d2c8..761404ba18 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -229,8 +229,7 @@ pane_size_watcher (Paned* pane) } Editor::Editor () - : VisibilityTracker (*((Gtk::Window*) this)) - , _join_object_range_state (JOIN_OBJECT_RANGE_NONE) + : _join_object_range_state (JOIN_OBJECT_RANGE_NONE) /* time display buttons */ , minsec_label (_("Mins:Secs")) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 6c0a52fa42..f9ce1da514 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -43,7 +43,6 @@ #include "gtkmm2ext/dndtreeview.h" #include "gtkmm2ext/stateful_button.h" #include "gtkmm2ext/bindings.h" -#include "gtkmm2ext/visibility_tracker.h" #include "pbd/stateful.h" #include "pbd/signals.h" @@ -137,7 +136,7 @@ class TimeSelection; class RegionLayeringOrderEditor; class VerboseCursor; -class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public Gtkmm2ext::VisibilityTracker +class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr { public: Editor (); diff --git a/gtk2_ardour/public_editor.cc b/gtk2_ardour/public_editor.cc index dc468e4a83..6c5d528e1e 100644 --- a/gtk2_ardour/public_editor.cc +++ b/gtk2_ardour/public_editor.cc @@ -30,6 +30,7 @@ sigc::signal<void> PublicEditor::DropDownKeys; PublicEditor::PublicEditor () : Window (Gtk::WINDOW_TOPLEVEL) + , VisibilityTracker (*((Gtk::Window*)this)) { } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index a96e451a31..7a4dd5d59b 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -39,6 +39,8 @@ #include "pbd/statefuldestructible.h" +#include "gtkmm2ext/visibility_tracker.h" + #include "editing.h" #include "canvas.h" #include "selection.h" @@ -97,7 +99,7 @@ using ARDOUR::framecnt_t; * of PublicEditor need not be recompiled if private methods or member variables * change. */ -class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { +class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, public Gtkmm2ext::VisibilityTracker { public: PublicEditor (); virtual ~PublicEditor (); diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc index cb63f4f822..627e9a1744 100644 --- a/gtk2_ardour/window_manager.cc +++ b/gtk2_ardour/window_manager.cc @@ -112,6 +112,26 @@ WindowManager::set_session (ARDOUR::Session* s) } } +void +WindowManager::set_transient_for (Gtk::Window* parent) +{ + if (parent) { + for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) { + Gtk::Window* win = (*i)->get(); + if (win) { + win->set_transient_for (*parent); + } + } + } else { + for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) { + Gtk::Window* win = (*i)->get(); + if (win) { + gtk_window_set_transient_for (win->gobj(), 0); + } + } + } +} + /*-----------------------*/ WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu_name) diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h index 9f4382725d..082407b61d 100644 --- a/gtk2_ardour/window_manager.h +++ b/gtk2_ardour/window_manager.h @@ -180,6 +180,9 @@ class WindowManager void set_session (ARDOUR::Session*); void add_state (XMLNode&) const; + /* HACK HACK HACK */ + void set_transient_for (Gtk::Window*); + private: typedef std::list<ProxyBase*> Windows; Windows _windows; |