summaryrefslogtreecommitdiff
path: root/gtk2_ardour/window_manager.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-05-08 14:48:28 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-05-08 14:48:28 -0400
commitbebe2af95ad9999fdca719450dc2c70cfb849076 (patch)
tree2bf6f4bae48b72c4607751bf370cbb1f2ce70a15 /gtk2_ardour/window_manager.cc
parente1b0f1bd0b03c071d2b5987e4ab75ef059e32111 (diff)
parentcadfc2aee13e14af341dd68f33308a421820c855 (diff)
merge with master
Diffstat (limited to 'gtk2_ardour/window_manager.cc')
-rw-r--r--gtk2_ardour/window_manager.cc122
1 files changed, 93 insertions, 29 deletions
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index f50fe444a8..4a3d5f6ce4 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -25,29 +25,33 @@
#include "gtkmm2ext/visibility_tracker.h"
#include "actions.h"
+#include "ardour_dialog.h"
+#include "ardour_window.h"
#include "window_manager.h"
#include "i18n.h"
using std::string;
+using namespace WM;
-WindowManager* WindowManager::_instance = 0;
+Manager* Manager::_instance = 0;
-WindowManager&
-WindowManager::instance ()
+Manager&
+Manager::instance ()
{
if (!_instance) {
- _instance = new WindowManager;
+ _instance = new Manager;
}
return *_instance;
}
-WindowManager::WindowManager ()
+Manager::Manager ()
+ : current_transient_parent (0)
{
}
void
-WindowManager::register_window (ProxyBase* info)
+Manager::register_window (ProxyBase* info)
{
_windows.push_back (info);
@@ -59,12 +63,12 @@ WindowManager::register_window (ProxyBase* info)
}
info->set_action (ActionManager::register_action (window_actions, info->action_name().c_str(), info->menu_name().c_str(),
- sigc::bind (sigc::mem_fun (*this, &WindowManager::toggle_window), info)));
+ sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)));
}
}
void
-WindowManager::remove (const ProxyBase* info)
+Manager::remove (const ProxyBase* info)
{
for (Windows::iterator i = _windows.begin(); i != _windows.end(); ++i) {
if ((*i) == info) {
@@ -75,7 +79,7 @@ WindowManager::remove (const ProxyBase* info)
}
void
-WindowManager::toggle_window (ProxyBase* proxy)
+Manager::toggle_window (ProxyBase* proxy)
{
if (proxy) {
proxy->toggle ();
@@ -83,7 +87,7 @@ WindowManager::toggle_window (ProxyBase* proxy)
}
void
-WindowManager::show_visible() const
+Manager::show_visible() const
{
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
if ((*i)->visible()) {
@@ -94,15 +98,20 @@ WindowManager::show_visible() const
}
void
-WindowManager::add_state (XMLNode& root) const
+Manager::add_state (XMLNode& root) const
{
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
+ /* don't save state for temporary proxy windows
+ */
+ if (dynamic_cast<ProxyTemporary*> (*i)) {
+ continue;
+ }
root.add_child_nocopy ((*i)->get_state());
}
}
void
-WindowManager::set_session (ARDOUR::Session* s)
+Manager::set_session (ARDOUR::Session* s)
{
for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
ARDOUR::SessionHandlePtr* sp = (*i)->session_handle ();
@@ -112,9 +121,34 @@ WindowManager::set_session (ARDOUR::Session* s)
}
}
-/*-----------------------*/
+void
+Manager::set_transient_for (Gtk::Window* parent)
+{
+#ifndef __APPLE__
+ if (parent) {
+ for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
+ Gtk::Window* win = (*i)->get();
+ if (win) {
+ std::cerr << "marked " << win->get_title() << " as transient of " << parent->get_title() << std::endl;
+ 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);
+ }
+ }
+ }
+
+ current_transient_parent = parent;
+#endif
+}
+
+/*-------------------------*/
-WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu_name)
+ProxyBase::ProxyBase (const string& name, const std::string& menu_name)
: _name (name)
, _menu_name (menu_name)
, _window (0)
@@ -127,7 +161,7 @@ WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu
{
}
-WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XMLNode& node)
+ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XMLNode& node)
: _name (name)
, _menu_name (menu_name)
, _window (0)
@@ -141,13 +175,13 @@ WindowManager::ProxyBase::ProxyBase (const string& name, const std::string& menu
set_state (node);
}
-WindowManager::ProxyBase::~ProxyBase ()
+ProxyBase::~ProxyBase ()
{
delete vistracker;
}
void
-WindowManager::ProxyBase::set_state (const XMLNode& node)
+ProxyBase::set_state (const XMLNode& node)
{
XMLNodeList children = node.children ();
@@ -192,19 +226,19 @@ WindowManager::ProxyBase::set_state (const XMLNode& node)
}
void
-WindowManager::ProxyBase::set_action (Glib::RefPtr<Gtk::Action> act)
+ProxyBase::set_action (Glib::RefPtr<Gtk::Action> act)
{
_action = act;
}
std::string
-WindowManager::ProxyBase::action_name() const
+ProxyBase::action_name() const
{
return string_compose (X_("toggle-%1"), _name);
}
void
-WindowManager::ProxyBase::toggle()
+ProxyBase::toggle()
{
if (!_window) {
(void) get (true);
@@ -221,7 +255,7 @@ WindowManager::ProxyBase::toggle()
}
XMLNode&
-WindowManager::ProxyBase::get_state () const
+ProxyBase::get_state () const
{
XMLNode* node = new XMLNode (X_("Window"));
char buf[32];
@@ -252,7 +286,7 @@ WindowManager::ProxyBase::get_state () const
}
void
-WindowManager::ProxyBase::drop_window ()
+ProxyBase::drop_window ()
{
if (_window) {
_window->hide ();
@@ -264,7 +298,7 @@ WindowManager::ProxyBase::drop_window ()
}
void
-WindowManager::ProxyBase::use_window (Gtk::Window& win)
+ProxyBase::use_window (Gtk::Window& win)
{
drop_window ();
_window = &win;
@@ -272,12 +306,17 @@ WindowManager::ProxyBase::use_window (Gtk::Window& win)
}
void
-WindowManager::ProxyBase::setup ()
+ProxyBase::setup ()
{
assert (_window);
vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
+ if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
+ /* cancel any mouse-based positioning */
+ _window->set_position (Gtk::WIN_POS_NONE);
+ }
+
if (_width != -1 && _height != -1) {
_window->set_default_size (_width, _height);
}
@@ -288,14 +327,14 @@ WindowManager::ProxyBase::setup ()
}
void
-WindowManager::ProxyBase::show ()
+ProxyBase::show ()
{
Gtk::Window* win = get (true);
win->show ();
}
void
-WindowManager::ProxyBase::maybe_show ()
+ProxyBase::maybe_show ()
{
if (_visible) {
show ();
@@ -303,7 +342,7 @@ WindowManager::ProxyBase::maybe_show ()
}
void
-WindowManager::ProxyBase::show_all ()
+ProxyBase::show_all ()
{
Gtk::Window* win = get (true);
win->show_all ();
@@ -311,15 +350,18 @@ WindowManager::ProxyBase::show_all ()
void
-WindowManager::ProxyBase::present ()
+ProxyBase::present ()
{
Gtk::Window* win = get (true);
win->show_all ();
win->present ();
+
+ /* turn off any mouse-based positioning */
+ _window->set_position (Gtk::WIN_POS_NONE);
}
void
-WindowManager::ProxyBase::hide ()
+ProxyBase::hide ()
{
Gtk::Window* win = get (false);
if (win) {
@@ -327,3 +369,25 @@ WindowManager::ProxyBase::hide ()
}
}
+/*-----------------------*/
+
+ProxyTemporary::ProxyTemporary (const string& name, Gtk::Window* win)
+ : ProxyBase (name, string())
+{
+ _window = win;
+}
+
+ProxyTemporary::~ProxyTemporary ()
+{
+}
+
+ARDOUR::SessionHandlePtr*
+ProxyTemporary::session_handle()
+{
+ /* may return null */
+ ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+ if (aw) { return aw; }
+ ArdourDialog* ad = dynamic_cast<ArdourDialog*> (_window);
+ if (ad) { return ad; }
+ return 0;
+}