mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 20:26:30 +01:00
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
This commit is contained in:
parent
e8301185c0
commit
a902737db9
11 changed files with 125 additions and 59 deletions
|
|
@ -148,6 +148,13 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
||||||
: Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp)
|
: Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp)
|
||||||
|
|
||||||
, gui_object_state (new GUIObjectState)
|
, 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))
|
, 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))
|
, 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);
|
Gtkmm2ext::init(localedir);
|
||||||
|
|
||||||
splash = 0;
|
splash = 0;
|
||||||
_startup = 0;
|
|
||||||
|
|
||||||
if (theArdourUI == 0) {
|
if (theArdourUI == 0) {
|
||||||
theArdourUI = this;
|
theArdourUI = this;
|
||||||
|
|
@ -688,7 +694,6 @@ ARDOUR_UI::startup ()
|
||||||
app->ready ();
|
app->ready ();
|
||||||
|
|
||||||
nsm_url = getenv ("NSM_URL");
|
nsm_url = getenv ("NSM_URL");
|
||||||
nsm = 0;
|
|
||||||
|
|
||||||
if (nsm_url) {
|
if (nsm_url) {
|
||||||
nsm = new NSM_Client;
|
nsm = new NSM_Client;
|
||||||
|
|
|
||||||
|
|
@ -301,6 +301,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
|
||||||
Gtk::Tooltips _tooltips;
|
Gtk::Tooltips _tooltips;
|
||||||
NSM_Client *nsm;
|
NSM_Client *nsm;
|
||||||
bool _was_dirty;
|
bool _was_dirty;
|
||||||
|
bool _mixer_on_top;
|
||||||
|
|
||||||
void goto_editor_window ();
|
void goto_editor_window ();
|
||||||
void goto_mixer_window ();
|
void goto_mixer_window ();
|
||||||
|
|
|
||||||
|
|
@ -268,19 +268,21 @@ ARDOUR_UI::goto_editor_window ()
|
||||||
|
|
||||||
editor->show_window ();
|
editor->show_window ();
|
||||||
editor->present ();
|
editor->present ();
|
||||||
flush_pending ();
|
/* mixer should now be on top */
|
||||||
|
WindowManager::instance().set_transient_for (editor);
|
||||||
|
_mixer_on_top = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ARDOUR_UI::goto_mixer_window ()
|
ARDOUR_UI::goto_mixer_window ()
|
||||||
{
|
{
|
||||||
if (!editor) {
|
Glib::RefPtr<Gdk::Window> win;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Glib::RefPtr<Gdk::Window> win = editor->get_window ();
|
|
||||||
Glib::RefPtr<Gdk::Screen> screen;
|
Glib::RefPtr<Gdk::Screen> screen;
|
||||||
|
|
||||||
|
if (editor) {
|
||||||
|
win = editor->get_window ();
|
||||||
|
}
|
||||||
|
|
||||||
if (win) {
|
if (win) {
|
||||||
screen = win->get_screen();
|
screen = win->get_screen();
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -295,10 +297,11 @@ ARDOUR_UI::goto_mixer_window ()
|
||||||
|
|
||||||
mixer->show_window ();
|
mixer->show_window ();
|
||||||
mixer->present ();
|
mixer->present ();
|
||||||
flush_pending ();
|
/* mixer should now be on top */
|
||||||
|
WindowManager::instance().set_transient_for (mixer);
|
||||||
|
_mixer_on_top = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ARDOUR_UI::toggle_mixer_window ()
|
ARDOUR_UI::toggle_mixer_window ()
|
||||||
{
|
{
|
||||||
|
|
@ -319,49 +322,80 @@ ARDOUR_UI::toggle_mixer_window ()
|
||||||
void
|
void
|
||||||
ARDOUR_UI::toggle_editor_mixer ()
|
ARDOUR_UI::toggle_editor_mixer ()
|
||||||
{
|
{
|
||||||
if (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->get_screen() != mixer->get_screen()) {
|
if (editor && mixer) {
|
||||||
// different screens, so don't do anything
|
|
||||||
return;
|
/* 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) {
|
||||||
|
goto_editor_window ();
|
||||||
|
} else {
|
||||||
|
goto_mixer_window ();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* 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)) {
|
|
||||||
/* they do not intersect so do not toggle */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mixer && mixer->fully_visible()) {
|
|
||||||
goto_editor_window ();
|
|
||||||
} else {
|
|
||||||
goto_mixer_window ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -229,8 +229,7 @@ pane_size_watcher (Paned* pane)
|
||||||
}
|
}
|
||||||
|
|
||||||
Editor::Editor ()
|
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 */
|
/* time display buttons */
|
||||||
, minsec_label (_("Mins:Secs"))
|
, minsec_label (_("Mins:Secs"))
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@
|
||||||
#include "gtkmm2ext/dndtreeview.h"
|
#include "gtkmm2ext/dndtreeview.h"
|
||||||
#include "gtkmm2ext/stateful_button.h"
|
#include "gtkmm2ext/stateful_button.h"
|
||||||
#include "gtkmm2ext/bindings.h"
|
#include "gtkmm2ext/bindings.h"
|
||||||
#include "gtkmm2ext/visibility_tracker.h"
|
|
||||||
|
|
||||||
#include "pbd/stateful.h"
|
#include "pbd/stateful.h"
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
|
|
@ -137,7 +136,7 @@ class TimeSelection;
|
||||||
class RegionLayeringOrderEditor;
|
class RegionLayeringOrderEditor;
|
||||||
class VerboseCursor;
|
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:
|
public:
|
||||||
Editor ();
|
Editor ();
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ sigc::signal<void> PublicEditor::DropDownKeys;
|
||||||
|
|
||||||
PublicEditor::PublicEditor ()
|
PublicEditor::PublicEditor ()
|
||||||
: Window (Gtk::WINDOW_TOPLEVEL)
|
: Window (Gtk::WINDOW_TOPLEVEL)
|
||||||
|
, VisibilityTracker (*((Gtk::Window*)this))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,8 @@
|
||||||
|
|
||||||
#include "pbd/statefuldestructible.h"
|
#include "pbd/statefuldestructible.h"
|
||||||
|
|
||||||
|
#include "gtkmm2ext/visibility_tracker.h"
|
||||||
|
|
||||||
#include "editing.h"
|
#include "editing.h"
|
||||||
#include "canvas.h"
|
#include "canvas.h"
|
||||||
#include "selection.h"
|
#include "selection.h"
|
||||||
|
|
@ -97,7 +99,7 @@ using ARDOUR::framecnt_t;
|
||||||
* of PublicEditor need not be recompiled if private methods or member variables
|
* of PublicEditor need not be recompiled if private methods or member variables
|
||||||
* change.
|
* change.
|
||||||
*/
|
*/
|
||||||
class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
|
class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, public Gtkmm2ext::VisibilityTracker {
|
||||||
public:
|
public:
|
||||||
PublicEditor ();
|
PublicEditor ();
|
||||||
virtual ~PublicEditor ();
|
virtual ~PublicEditor ();
|
||||||
|
|
|
||||||
|
|
@ -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)
|
WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu_name)
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,9 @@ class WindowManager
|
||||||
void set_session (ARDOUR::Session*);
|
void set_session (ARDOUR::Session*);
|
||||||
void add_state (XMLNode&) const;
|
void add_state (XMLNode&) const;
|
||||||
|
|
||||||
|
/* HACK HACK HACK */
|
||||||
|
void set_transient_for (Gtk::Window*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::list<ProxyBase*> Windows;
|
typedef std::list<ProxyBase*> Windows;
|
||||||
Windows _windows;
|
Windows _windows;
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
#include <gtk/gtkpaned.h>
|
#include <gtk/gtkpaned.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
#include <gtkmm2ext/utils.h>
|
|
||||||
#include <gtkmm/widget.h>
|
#include <gtkmm/widget.h>
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/window.h>
|
#include <gtkmm/window.h>
|
||||||
|
|
@ -32,6 +31,8 @@
|
||||||
#include <gtkmm/comboboxtext.h>
|
#include <gtkmm/comboboxtext.h>
|
||||||
#include <gtkmm/tooltip.h>
|
#include <gtkmm/tooltip.h>
|
||||||
|
|
||||||
|
#include "gtkmm2ext/utils.h"
|
||||||
|
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
@ -659,3 +660,4 @@ Gtkmm2ext::disable_tooltips ()
|
||||||
{
|
{
|
||||||
gtk_rc_parse_string ("gtk-enable-tooltips = 0");
|
gtk_rc_parse_string ("gtk-enable-tooltips = 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ bool
|
||||||
VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev)
|
VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev)
|
||||||
{
|
{
|
||||||
_visibility = ev->state;
|
_visibility = ev->state;
|
||||||
std::cerr << "VT: " << _window.get_title() << " vis event, fv = " << fully_visible() << " pv = " << partially_visible() << " nv = " << not_visible() << std::endl;
|
// std::cerr << "VT: " << _window.get_title() << " vis event, fv = " << fully_visible() << " pv = " << partially_visible() << " nv = " << not_visible() << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue