X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fwindow_manager.cc;h=1d63751c5ec369e9f1fe1eee4c768274206b02e0;hb=d26aac90204a87e00ea3b2cb622a7f5729bfbc4a;hp=dd65e956fac2d73e3e0e566205e25bdc4ae4c884;hpb=75e671b8674047900bd3c8b0bcbe9e4b97b26eb0;p=ardour.git diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc index dd65e956fa..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,10 +69,44 @@ 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 @@ -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,7 +244,8 @@ ProxyBase::setup () { WindowProxy::setup (); set_session(_session); -} + +} /*-----------------------*/