restore last used driver+devices for a given backend.
[ardour.git] / gtk2_ardour / window_manager.h
index 404bfd69d361a7290a3dfa254b26c8c190820fbb..6e89be3b267a66482aea6a6c08c5db34fe804cb0 100644 (file)
@@ -47,7 +47,7 @@ namespace WM {
 
 class ProxyBase;
 
-class Manager 
+class Manager : public ARDOUR::SessionHandlePtr
 {
   public:
     static Manager& instance();
@@ -74,41 +74,41 @@ class Manager
 
     static Manager* _instance;
 };
-       
-class ProxyBase : public sigc::trackable {
+
+class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
   public:
     ProxyBase (const std::string& name, const std::string& menu_name);
     ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
     virtual ~ProxyBase();
-    
+
     void show ();
     void show_all ();
     void hide ();
     void present ();
     void maybe_show ();
-    
+
     bool visible() const { return _visible; }
     const std::string& name() const { return _name; }
     const std::string& menu_name() const { return _menu_name; }
-    
+
     std::string action_name() const;
     void set_action (Glib::RefPtr<Gtk::Action>);
     Glib::RefPtr<Gtk::Action> action() const { return _action; };
-    
+
     void drop_window ();
     void use_window (Gtk::Window&);
-    
+
     virtual Gtk::Window* get (bool create = false) = 0;
-    
+
     virtual void toggle ();
-    
+
     void set_state (const XMLNode&);
     XMLNode& get_state () const;
-    
+
     virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
-    
+
     operator bool() const { return _window != 0; }
-    
+
   protected:
     std::string  _name;
     std::string  _menu_name;
@@ -122,53 +122,54 @@ class ProxyBase : public sigc::trackable {
     Gtkmm2ext::VisibilityTracker* vistracker;
 
     void save_pos_and_size ();
-    
+    bool delete_event_handler (GdkEventAny *ev);
+
     void setup ();
 };
-       
+
 class ProxyTemporary: public ProxyBase {
   public:
     ProxyTemporary (const std::string& name, Gtk::Window* win);
     ~ProxyTemporary();
-    
-    Gtk::Window* get (bool create = false) { 
+
+    Gtk::Window* get (bool create = false) {
            (void) create;
            return _window;
     }
-    
-    Gtk::Window* operator->() { 
+
+    Gtk::Window* operator->() {
            return _window;
     }
-    
+
     ARDOUR::SessionHandlePtr* session_handle ();
 };
-       
+
 template<typename T>
 class ProxyWithConstructor: public ProxyBase {
   public:
     ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
            : ProxyBase (name, menu_name) , creator (c) {}
-       
+
     ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
-           : ProxyBase (name, menu_name, node) , creator (c) {}
-       
-    Gtk::Window* get (bool create = false) { 
+           : ProxyBase (name, menu_name, *node) , creator (c) {}
+
+    Gtk::Window* get (bool create = false) {
            if (!_window) {
                    if (!create) {
                            return 0;
                    }
 
-                   _window = creator ();
+                       _window = dynamic_cast<Gtk::Window*> (creator ());
 
                    if (_window) {
                            setup ();
-                   }   
+                   }
            }
 
            return _window;
     }
 
-    T* operator->() { 
+    T* operator->() {
            return dynamic_cast<T*> (get (true));
     }
 
@@ -177,6 +178,15 @@ class ProxyWithConstructor: public ProxyBase {
            return dynamic_cast<T*> (_window);
     }
 
+    void set_session(ARDOUR::Session *s) {
+        SessionHandlePtr::set_session (s);
+        ARDOUR::SessionHandlePtr* sp = session_handle ();
+        if (sp) {
+            sp->set_session (s);
+            dynamic_cast<T*>(_window)->set_session(s);
+        }
+    }
+
   private:
     boost::function<T*()>      creator;
 };
@@ -188,9 +198,9 @@ class Proxy : public ProxyBase {
            : ProxyBase (name, menu_name) {}
 
     Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
-           : ProxyBase (name, menu_name, node)  {}
-       
-    Gtk::Window* get (bool create = false) { 
+           : ProxyBase (name, menu_name, *node)  {}
+
+    Gtk::Window* get (bool create = false) {
            if (!_window) {
                    if (!create) {
                            return 0;
@@ -200,13 +210,13 @@ class Proxy : public ProxyBase {
 
                    if (_window) {
                            setup ();
-                   }   
+                   }
            }
 
            return _window;
     }
 
-    T* operator->() { 
+    T* operator->() {
            return dynamic_cast<T*> (get(true));
     }
 
@@ -215,10 +225,19 @@ class Proxy : public ProxyBase {
            return dynamic_cast<T*> (_window);
     }
 
+    void set_session(ARDOUR::Session *s) {
+        SessionHandlePtr::set_session (s);
+        ARDOUR::SessionHandlePtr* sp = session_handle ();
+        if (sp) {
+            sp->set_session (s);
+            dynamic_cast<T*>(_window)->set_session(s);
+        }
+    }
+
   private:
     boost::function<T*()>      creator;
 };
-    
+
 } /* namespace */
 
 #endif /* __gtk2_ardour_window_manager_h__ */