X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fwindow_manager.cc;h=1d63751c5ec369e9f1fe1eee4c768274206b02e0;hb=79731a716deae9a90be646695480f06f92c268f5;hp=cac4bcd968ea744220f2faeec09a739c7a78b65c;hpb=bc487bb4b02a9780938d6cf8528c888e59161aa9;p=ardour.git diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc index cac4bcd968..1d63751c5e 100644 --- a/gtk2_ardour/window_manager.cc +++ b/gtk2_ardour/window_manager.cc @@ -32,7 +32,7 @@ #include "window_manager.h" #include "processor_box.h" -#include "i18n.h" +#include "pbd/i18n.h" using std::string; using namespace WM; @@ -69,12 +69,46 @@ Manager::register_window (ProxyBase* info) window_actions = ARDOUR_UI::instance()->global_actions.create_action_group (X_("Window")); } - info->set_action (ARDOUR_UI::instance()->global_actions.register_toggle_action (window_actions, - info->action_name().c_str(), info->menu_name().c_str(), - sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info))); + ARDOUR_UI::instance()->global_actions.register_toggle_action (window_actions, + info->action_name().c_str(), info->menu_name().c_str(), + sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)); + + info->signal_map.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_mapped), info)); + info->signal_unmap.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_unmapped), info)); + } } +void +Manager::window_proxy_was_mapped (ProxyBase* proxy) +{ + Glib::RefPtr act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name())); + if (!act) { + return; + } + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (!tact) { + return; + } + + tact->set_active (true); +} + +void +Manager::window_proxy_was_unmapped (ProxyBase* proxy) +{ + Glib::RefPtr act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name())); + if (!act) { + return; + } + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (!tact) { + return; + } + + tact->set_active (false); +} + void Manager::remove (const ProxyBase* info) { @@ -89,7 +123,6 @@ Manager::remove (const ProxyBase* info) void Manager::toggle_window (ProxyBase* proxy) { - Glib::RefPtr act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name())); if (!act) { return; @@ -111,12 +144,27 @@ Manager::show_visible() const { for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) { if ((*i)->visible()) { - if (! (*i)->get (true)) { + Gtk::Window* win = (*i)->get (true); + if (!win) { /* the window may be a plugin GUI for a plugin which * is disabled or longer present. */ continue; } + if (dynamic_cast (win)) { + /* do not show dialogs at startup. Most + * dialogs require some signal connection work + * because we are trying to avoid recursive + * event loops (connecting instead to + * ::signal_response(). This means we need to + * destroy the window as well, so that the code + * which checks if it should be created will + * find that it is missing and will create it + * and connect to any necessary signals. + */ + (*i)->drop_window (); + continue; + } (*i)->show_all (); (*i)->present (); } @@ -196,6 +244,7 @@ ProxyBase::setup () { WindowProxy::setup (); set_session(_session); + } /*-----------------------*/