added RCU handling of Session route list, and major use of shared_ptr<T> everywhere...
[ardour.git] / gtk2_ardour / io_selector.h
index 9485eacd027e82a295634a8013be755c7639245c..993d4aa1ad0da73f3e9df1638a2af6cb1ea2995b 100644 (file)
@@ -29,10 +29,20 @@ using __gnu_cxx::slist;
 #endif
 
 #include <string>
-#include <gtkmm.h>
+
+#include <glibmm/thread.h>
+
+#include <gtkmm/box.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/button.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/liststore.h>
 
 #include <ardour_dialog.h>
 
+
 namespace ARDOUR {
        class IO;
        class Session;
@@ -43,7 +53,7 @@ namespace ARDOUR {
 
 class IOSelector : public Gtk::VBox {
   public:
-       IOSelector (ARDOUR::Session&, ARDOUR::IO&, bool for_input);
+       IOSelector (ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>, bool for_input);
        ~IOSelector ();
 
        void redisplay ();
@@ -57,15 +67,30 @@ class IOSelector : public Gtk::VBox {
 
   protected:
        ARDOUR::Session& session;
-
+       
   private:
-       ARDOUR::IO& io;
+       boost::shared_ptr<ARDOUR::IO> io;
        bool for_input;
        ARDOUR::Port *selected_port;
 
        Gtk::VBox main_box;
        Gtk::HBox port_and_selector_box;
 
+       /* column model */
+
+       struct PortDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
+
+           PortDisplayModelColumns() { 
+                   add (displayed_name);
+                   add (full_name);
+           }
+
+           Gtk::TreeModelColumn<Glib::ustring>       displayed_name;
+           Gtk::TreeModelColumn<Glib::ustring>       full_name;
+       };
+
+       PortDisplayModelColumns port_display_columns;
+
        /* client/port selection */
 
        Gtk::Notebook notebook;
@@ -84,14 +109,14 @@ class IOSelector : public Gtk::VBox {
        Gtk::Button clear_connections_button;
        Gtk::ScrolledWindow port_display_scroller;
 
-       PBD::Lock port_display_lock;
-       slist<Gtk::CList *> port_displays;
+       Glib::Mutex port_display_lock;
+       slist<Gtk::TreeView *> port_displays;
        void display_ports ();
 
        void rescan ();
        void clear_connections ();
 
-       void port_selection_handler (gint row, gint col, GdkEvent *ev, Gtk::CList *);
+       bool port_selection_changed(GdkEventButton *, Gtk::TreeView*);
 
        void ports_changed (ARDOUR::IOChange, void *);
        void name_changed (void*);
@@ -100,29 +125,27 @@ class IOSelector : public Gtk::VBox {
        void remove_port ();
        gint remove_port_when_idle (ARDOUR::Port *);
 
-       gint port_column_button_release (GdkEventButton*, Gtk::CList*);
-       gint connection_click (GdkEventButton *, Gtk::CList *clist);
+       gint port_column_button_release (GdkEventButton *, Gtk::TreeView*);
+       gint connection_button_release (GdkEventButton *, Gtk::TreeView*);
        
-       void select_clist(Gtk::CList*);
-       void select_next_clist ();
+       void select_treeview(Gtk::TreeView*);
+       void select_next_treeview ();
 };
 
 class IOSelectorWindow : public ArdourDialog
 {
   public:
-       IOSelectorWindow (ARDOUR::Session&, ARDOUR::IO&, bool for_input, bool can_cancel=false);
+       IOSelectorWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>, bool for_input, bool can_cancel=false);
        ~IOSelectorWindow ();
 
        IOSelector& selector() { return _selector; }
 
   protected:
-       bool on_map (GdkEventAny *);
+       void on_map ();
        
   private:
        IOSelector _selector;
 
-       Gtk::VBox vbox;
-
        /* overall operation buttons */
 
        Gtk::Button ok_button;
@@ -139,7 +162,7 @@ class IOSelectorWindow : public ArdourDialog
 class PortInsertUI : public Gtk::VBox
 {
   public: 
-       PortInsertUI (ARDOUR::Session&, ARDOUR::PortInsert&);
+       PortInsertUI (ARDOUR::Session&, boost::shared_ptr<ARDOUR::PortInsert>);
        
        void redisplay ();
        void finished (IOSelector::Result);
@@ -155,10 +178,10 @@ class PortInsertUI : public Gtk::VBox
 class PortInsertWindow : public ArdourDialog
 {
   public: 
-       PortInsertWindow (ARDOUR::Session&, ARDOUR::PortInsert&, bool can_cancel=false);
+       PortInsertWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::PortInsert>, bool can_cancel=false);
        
   protected:
-       bool on_map (GdkEventAny *);
+       void on_map ();
        
   private: