X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fio_selector.cc;h=7ff12612e60c30dee554a382f311fa766ef8c6e8;hb=767984b486086e3682e521179c2fb8364b3bba76;hp=fabfc5c0ca3c9a2689389c05551b9d784a0c0e51;hpb=08d33fcb0d35b6448ac1b5a4bcc54095cacbfccd;p=ardour.git diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc index fabfc5c0ca..7ff12612e6 100644 --- a/gtk2_ardour/io_selector.cc +++ b/gtk2_ardour/io_selector.cc @@ -15,13 +15,16 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include #include -#include +#include + +#include + +#include #include #include @@ -29,15 +32,14 @@ #include #include #include -#include +#include #include #include +#include #include "utils.h" -#include "ardour_message.h" #include "io_selector.h" -#include "extra_bind.h" #include "keyboard.h" #include "gui_thread.h" @@ -45,10 +47,13 @@ using namespace std; using namespace Gtk; +using namespace Glib; using namespace sigc; using namespace ARDOUR; +using namespace PBD; +using namespace Gtkmm2ext; -IOSelectorWindow::IOSelectorWindow (Session& sess, IO& ior, bool input, bool can_cancel) +IOSelectorWindow::IOSelectorWindow (Session& sess, boost::shared_ptr ior, bool input, bool can_cancel) : ArdourDialog ("i/o selector"), _selector (sess, ior, input), ok_button (can_cancel ? _("OK"): _("Close")), @@ -61,9 +66,9 @@ IOSelectorWindow::IOSelectorWindow (Session& sess, IO& ior, bool input, bool can string title; if (input) { - title = compose(_("%1 input"), ior.name()); + title = string_compose(_("%1 input"), ior->name()); } else { - title = compose(_("%1 output"), ior.name()); + title = string_compose(_("%1 output"), ior->name()); } ok_button.set_name ("IOSelectorButton"); @@ -77,25 +82,23 @@ IOSelectorWindow::IOSelectorWindow (Session& sess, IO& ior, bool input, bool can if (can_cancel) { button_box.pack_start (cancel_button); - } - else { + } else { cancel_button.hide(); } button_box.pack_start (ok_button); - vbox.pack_start (_selector); - vbox.pack_start (button_box, false, false); + get_vbox()->pack_start (_selector); + get_vbox()->pack_start (button_box, false, false); ok_button.signal_clicked().connect (mem_fun(*this, &IOSelectorWindow::accept)); cancel_button.signal_clicked().connect (mem_fun(*this, &IOSelectorWindow::cancel)); rescan_button.signal_clicked().connect (mem_fun(*this, &IOSelectorWindow::rescan)); set_title (title); - set_position (Gtk::WIN_POS_MOUSE); - add (vbox); + set_position (WIN_POS_MOUSE); - delete_event.connect (bind (ptr_fun (just_hide_it), reinterpret_cast (this))); + signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), reinterpret_cast (this))); } IOSelectorWindow::~IOSelectorWindow() @@ -122,19 +125,18 @@ IOSelectorWindow::accept () hide (); } - -gint -IOSelectorWindow::on_map (GdkEventAny *ev) +void +IOSelectorWindow::on_map () { _selector.redisplay (); - return Window::on_map (ev); + Window::on_map (); } /************************* The IO Selector "widget" *************************/ -IOSelector::IOSelector (Session& sess, IO& ior, bool input) +IOSelector::IOSelector (Session& sess, boost::shared_ptr ior, bool input) : session (sess), io (ior), for_input (input), @@ -173,48 +175,15 @@ IOSelector::IOSelector (Session& sess, IO& ior, bool input) port_display_scroller.set_name ("IOSelectorNotebook"); port_display_scroller.set_border_width (0); port_display_scroller.set_size_request (-1, 170); - port_display_scroller.add_with_viewport (port_box); - port_display_scroller.set_policy (Gtk::POLICY_NEVER, - Gtk::POLICY_AUTOMATIC); + port_display_scroller.add (port_box); + port_display_scroller.set_policy (POLICY_NEVER, + POLICY_AUTOMATIC); port_button_box.set_spacing (5); port_button_box.set_border_width (5); port_button_box.pack_start (add_port_button, false, false); - - if (for_input) { - if (io.input_maximum() < 0 || io.input_maximum() > (int) io.n_inputs()) { - add_port_button.set_sensitive (true); - } else { - add_port_button.set_sensitive (false); - } - - } else { - if (io.output_maximum() < 0 || io.output_maximum() > (int) io.n_outputs()) { - add_port_button.set_sensitive (true); - } else { - add_port_button.set_sensitive (false); - } - - } - port_button_box.pack_start (remove_port_button, false, false); - - if (for_input) { - if (io.input_minimum() < 0 || io.input_minimum() < (int) io.n_inputs()) { - remove_port_button.set_sensitive (true); - } else { - remove_port_button.set_sensitive (false); - } - - } else { - if (io.output_minimum() < 0 || io.output_minimum() < (int) io.n_outputs()) { - remove_port_button.set_sensitive (true); - } else { - remove_port_button.set_sensitive (false); - } - } - port_button_box.pack_start (clear_connections_button, false, false); port_and_button_box.set_border_width (5); @@ -240,18 +209,56 @@ IOSelector::IOSelector (Session& sess, IO& ior, bool input) remove_port_button.signal_clicked().connect (mem_fun(*this, &IOSelector::remove_port)); if (for_input) { - io.input_changed.connect (mem_fun(*this, &IOSelector::ports_changed)); + io->input_changed.connect (mem_fun(*this, &IOSelector::ports_changed)); } else { - io.output_changed.connect (mem_fun(*this, &IOSelector::ports_changed)); + io->output_changed.connect (mem_fun(*this, &IOSelector::ports_changed)); } - io.name_changed.connect (mem_fun(*this, &IOSelector::name_changed)); + io->name_changed.connect (mem_fun(*this, &IOSelector::name_changed)); } IOSelector::~IOSelector () { } +void +IOSelector::set_button_sensitivity () +{ + if (for_input) { + + if (io->input_maximum() < 0 || io->input_maximum() > (int) io->n_inputs()) { + add_port_button.set_sensitive (true); + } else { + add_port_button.set_sensitive (false); + } + + } else { + + if (io->output_maximum() < 0 || io->output_maximum() > (int) io->n_outputs()) { + add_port_button.set_sensitive (true); + } else { + add_port_button.set_sensitive (false); + } + + } + + if (for_input) { + if (io->n_inputs() && (io->input_minimum() < 0 || io->input_minimum() < (int) io->n_inputs())) { + remove_port_button.set_sensitive (true); + } else { + remove_port_button.set_sensitive (false); + } + + } else { + if (io->n_outputs() && (io->output_minimum() < 0 || io->output_minimum() < (int) io->n_outputs())) { + remove_port_button.set_sensitive (true); + } else { + remove_port_button.set_sensitive (false); + } + } +} + + void IOSelector::name_changed (void* src) { @@ -264,9 +271,9 @@ void IOSelector::clear_connections () { if (for_input) { - io.disconnect_inputs (this); + io->disconnect_inputs (this); } else { - io.disconnect_outputs (this); + io->disconnect_outputs (this); } } @@ -274,21 +281,23 @@ void IOSelector::rescan () { using namespace Notebook_Helpers; - using namespace CList_Helpers; - typedef map > > PortMap; + typedef std::map > > PortMap; PortMap portmap; const char **ports; PageList& pages = notebook.pages(); gint current_page; vector rowdata; - current_page = notebook.get_current_page_num (); + page_selection_connection.disconnect (); + + current_page = notebook.get_current_page (); + pages.clear (); /* get relevant current JACK ports */ - ports = session.engine().get_ports ("", JACK_DEFAULT_AUDIO_TYPE, for_input?JackPortIsOutput:JackPortIsInput); + ports = session.engine().get_ports ("", JACK_DEFAULT_AUDIO_TYPE, for_input ? JackPortIsOutput : JackPortIsInput); if (ports == 0) { return; @@ -308,15 +317,9 @@ IOSelector::rescan () pos = str.find (':'); - newpair.first = str.substr (0, pos); + newpair.first = str.substr (0, pos); portname = str.substr (pos+1); - /* this may or may not succeed at actually inserting. - we don't care, however: we just want an iterator - that gives us either the inserted element or - the existing one with the same name. - */ - result = portmap.insert (newpair); strpair.first = portname; @@ -330,216 +333,196 @@ IOSelector::rescan () for (i = portmap.begin(); i != portmap.end(); ++i) { Box *client_box = manage (new VBox); - Gtk::CList *client_port_display = manage (new Gtk::CList (1)); + TreeView *display = manage (new TreeView); + RefPtr model = ListStore::create (port_display_columns); ScrolledWindow *scroller = manage (new ScrolledWindow); - scroller->add_with_viewport (*client_port_display); - scroller->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - - client_box->pack_start (*scroller); - - client_port_display->set_selection_mode (GTK_SELECTION_BROWSE); - client_port_display->set_name ("IOSelectorList"); + display->set_model (model); + display->append_column (X_("notvisible"), port_display_columns.displayed_name); + display->set_headers_visible (false); + display->get_selection()->set_mode (SELECTION_SINGLE); + display->set_name ("IOSelectorList"); for (vector >::iterator s = i->second.begin(); s != i->second.end(); ++s) { - rowdata.clear (); - rowdata.push_back (s->first); - client_port_display->rows().push_back (rowdata); - client_port_display->rows().back().set_data (g_strdup (s->second.c_str()), free); - } + TreeModel::Row row = *(model->append ()); - client_port_display->columns_autosize (); - client_port_display->select_row.connect (bind (mem_fun(*this, &IOSelector::port_selection_handler), client_port_display)); + row[port_display_columns.displayed_name] = s->first; + row[port_display_columns.full_name] = s->second; + } + display->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::port_selection_changed), display)); Label *tab_label = manage (new Label); tab_label->set_name ("IOSelectorNotebookTab"); tab_label->set_text ((*i).first); + scroller->add (*display); + scroller->set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC); + + client_box->pack_start (*scroller); + pages.push_back (TabElem (*client_box, *tab_label)); } - notebook.set_page (current_page); - notebook.show.connect (bind (mem_fun (notebook, &Notebook::set_page), current_page)); + notebook.set_current_page (current_page); + page_selection_connection = notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page)); selector_box.show_all (); } void IOSelector::display_ports () { - CList *clist = 0; - CList *firstclist = 0; - CList *selected_port_list = 0; - + TreeView *firsttview = 0; + TreeView *selected_port_tview = 0; { - LockMonitor lm (port_display_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_display_lock); Port *port; uint32_t limit; - + if (for_input) { - limit = io.n_inputs(); + limit = io->n_inputs(); } else { - limit = io.n_outputs(); + limit = io->n_outputs(); } - - for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ) { - slist::iterator tmp; - + for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ) { + + slist::iterator tmp; + tmp = i; ++tmp; - + port_box.remove (**i); delete *i; port_displays.erase (i); - + i = tmp; } - + for (uint32_t n = 0; n < limit; ++n) { - const gchar *title[1]; + + TreeView* tview; + //ScrolledWindow *scroller; string really_short_name; - + if (for_input) { - port = io.input (n); + port = io->input (n); } else { - port = io.output (n); + port = io->output (n); } - + /* we know there is '/' because we put it there */ - + really_short_name = port->short_name(); really_short_name = really_short_name.substr (really_short_name.find ('/') + 1); - title[0] = really_short_name.c_str(); - clist = new CList (1, title); - if (!firstclist) { - firstclist = clist; + tview = manage (new TreeView()); + RefPtr port_model = ListStore::create (port_display_columns); + + if (!firsttview) { + firsttview = tview; } - port_displays.insert (port_displays.end(), clist); - port_box.pack_start (*clist); - - clist->set_data (_("port"), port); - - /* XXX THIS IS A DIGUSTING AND DIRTY HACK, FORCED UPON US BECAUSE - GtkCList DOESN'T PROVIDE ANY WAY TO CONNECT TO BUTTON_PRESS_EVENTS - FOR THE COLUMN TITLE BUTTON. - */ - - clist->column(0).get_widget(); // force the column title button to be created - GtkButton *b = GTK_BUTTON(clist->gobj()->column[0].button); // no API to access this - Gtk::Button *B = wrap (b); // make C++ signal handling easier. - - clist->column_titles_show (); - clist->column_titles_active (); - + tview->set_model (port_model); + tview->append_column (really_short_name, port_display_columns.displayed_name); + tview->get_selection()->set_mode (SELECTION_SINGLE); + tview->set_data (X_("port"), port); + tview->set_headers_visible (true); + tview->set_name (X_("IOSelectorPortList")); + + port_box.pack_start (*tview); + port_displays.insert (port_displays.end(), tview); + + /* now fill the clist with the current connections */ + + const char **connections = port->get_connections (); + + if (connections) { + for (uint32_t c = 0; connections[c]; ++c) { + TreeModel::Row row = *(port_model->append()); + row[port_display_columns.displayed_name] = connections[c]; + row[port_display_columns.full_name] = connections[c]; + } + } + if (for_input) { - - if (io.input_maximum() == 1) { + + if (io->input_maximum() == 1) { selected_port = port; - selected_port_list = clist; + selected_port_tview = tview; } else { if (port == selected_port) { - selected_port_list = clist; + selected_port_tview = tview; } } - B->signal_button_release_event.connect - (bind (mem_fun(*this, &IOSelector::port_column_button_release), clist)); - } else { - - if (io.output_maximum() == 1) { + + if (io->output_maximum() == 1) { selected_port = port; - selected_port_list = clist; + selected_port_tview = tview; } else { if (port == selected_port) { - selected_port_list = clist; + selected_port_tview = tview; } } - - B->signal_button_release_event.connect - (bind (mem_fun(*this, &IOSelector::port_column_button_release), clist)); - } - - clist->set_name ("IOSelectorPortList"); - clist->set_selection_mode (GTK_SELECTION_SINGLE); - clist->set_shadow_type (Gtk::SHADOW_IN); - clist->set_size_request (-1, 75); - - /* now fill the clist with the current connections */ - - const char **connections = port->get_connections (); - - if (connections) { - - for (uint32_t c = 0; connections[c]; ++c) { - - const gchar *txt[1]; - - txt[0] = connections[c]; - - clist->rows().push_back (txt); - } - - free (connections); } + + TreeViewColumn* col = tview->get_column (0); + + col->set_clickable (true); + + /* handle button events on the column header ... */ + col->signal_clicked().connect (bind (mem_fun(*this, &IOSelector::select_treeview), tview)); - clist->columns_autosize (); - clist->signal_button_release_event.connect (bind (mem_fun(*this, &IOSelector::connection_click), clist)); + /* ... and within the treeview itself */ + tview->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::connection_button_release), tview)); } - + port_box.show_all (); - - if (selected_port_list) { - selected_port_list->click_column(0); - selected_port_list->set_name ("IOSelectorPortListSelected"); - for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { - if (*i != selected_port_list) { - (*i)->set_name ("IOSelectorPortList"); - (*i)->queue_draw (); - } - } - } else { - selected_port = 0; - selector_box.hide_all (); - } } - if (selected_port_list) { - select_clist (selected_port_list); - } else if (firstclist) { - // select first - select_clist (firstclist); + if (!selected_port_tview) { + selected_port_tview = firsttview; + } + + if (selected_port_tview) { + select_treeview (selected_port_tview); } } -void -IOSelector::port_selection_handler (gint row, gint col, GdkEvent *ev, Gtk::CList *clist) +bool +IOSelector::port_selection_changed (GdkEventButton *ev, TreeView* treeview) { - using namespace CList_Helpers; + TreeModel::iterator i = treeview->get_selection()->get_selected(); int status; - if (selected_port == 0) { - return; + if (!i) { + return 0; } - string other_port_name = (char *) clist->rows()[row].get_data(); + if (selected_port == 0) { + return 0; + } + ustring other_port_name = (*i)[port_display_columns.full_name]; + if (for_input) { - if ((status = io.connect_input (selected_port, other_port_name, this)) == 0) { + if ((status = io->connect_input (selected_port, other_port_name, this)) == 0) { Port *p = session.engine().get_port_by_name (other_port_name); p->enable_metering(); } } else { - status = io.connect_output (selected_port, other_port_name, this); + status = io->connect_output (selected_port, other_port_name, this); } if (status == 0) { - select_next_clist (); + select_next_treeview (); } + + treeview->get_selection()->unselect_all(); + return 0; } void @@ -557,119 +540,111 @@ IOSelector::add_port () if (for_input) { - try { - - io.add_input_port ("", this); + io->add_input_port ("", this); } catch (AudioEngine::PortRegistrationFailure& err) { - ArdourMessage msg (0, X_("noport dialog"), - _("There are no more JACK ports available.")); - } - - if (io.input_maximum() >= 0 && io.input_maximum() <= (int) io.n_inputs()) { - add_port_button.set_sensitive (false); - } - - if (io.input_minimum() < (int) io.n_inputs()) { - remove_port_button.set_sensitive (true); + MessageDialog msg (0, _("There are no more JACK ports available.")); + msg.run (); } } else { try { - io.add_output_port ("", this); + io->add_output_port ("", this); } catch (AudioEngine::PortRegistrationFailure& err) { - ArdourMessage msg (0, X_("noport dialog"), - _("There are no more JACK ports available.")); - } - - if (io.output_maximum() >= 0 && io.output_maximum() <= (int) io.n_outputs()) { - add_port_button.set_sensitive (false); + MessageDialog msg (0, _("There are no more JACK ports available.")); + msg.run (); } } + + set_button_sensitivity (); } void IOSelector::remove_port () { - // always remove last port uint32_t nports; + + // always remove last port if (for_input) { - if ((nports = io.n_inputs()) > 0) { - io.remove_input_port (io.input(nports-1), this); - } - if (io.input_minimum() == (int) io.n_inputs()) { - remove_port_button.set_sensitive (false); + if ((nports = io->n_inputs()) > 0) { + io->remove_input_port (io->input(nports-1), this); } + } else { - if ((nports = io.n_outputs()) > 0) { - io.remove_output_port (io.output(nports-1), this); + if ((nports = io->n_outputs()) > 0) { + io->remove_output_port (io->output(nports-1), this); } } + + set_button_sensitivity (); } gint -IOSelector::remove_port_when_idle (Port *port) +IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview) { - if (for_input) { - io.remove_input_port (port, this); - } else { - io.remove_output_port (port, this); - } + /* this handles button release on a port name row: i.e. a connection + between the named port and the port represented by the treeview. + */ - return FALSE; -} + Gtk::TreeModel::iterator iter; + TreeModel::Path path; + TreeViewColumn* column; + int cellx; + int celly; -gint -IOSelector::port_column_button_release (GdkEventButton *event, CList *clist) -{ - if (Keyboard::is_delete_event (event)) { - Port* port; - { - LockMonitor lm (port_display_lock, __LINE__, __FILE__); - - port = reinterpret_cast (clist->get_data (_("port"))); - - if (port == selected_port) { - selected_port = 0; - clist->set_name ("IOSelectorPortList"); - clist->queue_draw(); - } - } + /* only handle button1 events here */ - /* remove the port when idle - if we do it here, we will destroy the widget - for whom we are handling an event. not good. - */ + if (ev->button != 1) { + return false; + } + + if (!treeview->get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { + return false; + } - Gtk::Main::idle.connect (bind (mem_fun(*this, &IOSelector::remove_port_when_idle), port)); + if ((iter = treeview->get_model()->get_iter (path.to_string()))) { - } else { - select_clist(clist); + /* path is valid */ + ustring connected_port_name = (*iter)[port_display_columns.full_name]; + Port *port = reinterpret_cast (treeview->get_data (X_("port"))); + + if (for_input) { + Port *p = session.engine().get_port_by_name (connected_port_name); + p->disable_metering(); + io->disconnect_input (port, connected_port_name, this); + } else { + io->disconnect_output (port, connected_port_name, this); + } } - return TRUE; + return true; } void -IOSelector::select_next_clist () +IOSelector::select_next_treeview () { - slist::iterator next; + slist::iterator next; - for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { + if (port_displays.empty() || port_displays.size() == 1) { + return; + } + + for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { if ((*i)->get_name() == "IOSelectorPortListSelected") { ++i; if (i == port_displays.end()) { - select_clist (port_displays.front()); + select_treeview (port_displays.front()); } else { - select_clist (*i); + select_treeview (*i); } break; @@ -678,61 +653,49 @@ IOSelector::select_next_clist () } void -IOSelector::select_clist(Gtk::CList* clist) +IOSelector::select_treeview (TreeView* tview) { - /* Gack. CList's don't respond visually to a change + /* Gack. TreeView's don't respond visually to a change in their state, so rename them to force a style switch. */ - LockMonitor lm (port_display_lock, __LINE__, __FILE__); - Port* port = reinterpret_cast (clist->get_data (_("port"))); - - if (port != selected_port) { - selected_port = port; - - clist->set_name ("IOSelectorPortListSelected"); - - for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { - if (*i != clist) { - (*i)->set_name ("IOSelectorPortList"); - (*i)->queue_draw (); - } - } - selector_box.show_all (); - } -} -gint -IOSelector::connection_click (GdkEventButton *ev, CList *clist) -{ - gint row, col; + Glib::Mutex::Lock lm (port_display_lock); + Port* port = reinterpret_cast (tview->get_data (X_("port"))); - /* only handle button1 events here */ + selected_port = port; - if (ev->button != 1) { - return FALSE; - } + tview->set_name ("IOSelectorPortListSelected"); + tview->queue_draw (); - if (clist->get_selection_info ((int)ev->x, (int)ev->y, &row, &col) == 0) { - return FALSE; - } + /* ugly hack to force the column header button to change as well */ - if (row < 0 || col < 0) { - return FALSE; + TreeViewColumn* col = tview->get_column (0); + GtkTreeViewColumn* ccol = col->gobj(); + + if (ccol->button) { + gtk_widget_set_name (ccol->button, "IOSelectorPortListSelected"); + gtk_widget_queue_draw (ccol->button); } - Port *port = reinterpret_cast (clist->get_data (_("port"))); - string connected_port_name = clist->cell(row,col).get_text (); - - if (for_input) { - Port *p = session.engine().get_port_by_name (connected_port_name); - p->disable_metering(); - io.disconnect_input (port, connected_port_name, this); - } else { - io.disconnect_output (port, connected_port_name, this); + for (slist::iterator i = port_displays.begin(); i != port_displays.end(); ++i) { + if (*i == tview) { + continue; + } + + col = (*i)->get_column (0); + ccol = col->gobj(); + + if (ccol->button) { + gtk_widget_set_name (ccol->button, "IOSelectorPortList"); + gtk_widget_queue_draw (ccol->button); + } + + (*i)->set_name ("IOSelectorPortList"); + (*i)->queue_draw (); } - return TRUE; + selector_box.show_all (); } void @@ -741,17 +704,17 @@ IOSelector::redisplay () display_ports (); if (for_input) { - if (io.input_maximum() != 0) { + if (io->input_maximum() != 0) { rescan (); } } else { - if (io.output_maximum() != 0) { + if (io->output_maximum() != 0) { rescan(); } } } -PortInsertUI::PortInsertUI (Session& sess, PortInsert& pi) +PortInsertUI::PortInsertUI (Session& sess, boost::shared_ptr pi) : input_selector (sess, pi, true), output_selector (sess, pi, false) { @@ -778,9 +741,9 @@ PortInsertUI::finished(IOSelector::Result r) } -PortInsertWindow::PortInsertWindow (Session& sess, PortInsert& pi, bool can_cancel) +PortInsertWindow::PortInsertWindow (Session& sess, boost::shared_ptr pi, bool can_cancel) : ArdourDialog ("port insert dialog"), - _portinsertui(sess, pi), + _portinsertui (sess, pi), ok_button (can_cancel ? _("OK"): _("Close")), cancel_button (_("Cancel")), rescan_button (_("Rescan")) @@ -788,7 +751,7 @@ PortInsertWindow::PortInsertWindow (Session& sess, PortInsert& pi, bool can_canc set_name ("IOSelectorWindow"); string title = _("ardour: "); - title += pi.name(); + title += pi->name(); set_title (title); ok_button.set_name ("IOSelectorButton"); @@ -807,32 +770,30 @@ PortInsertWindow::PortInsertWindow (Session& sess, PortInsert& pi, bool can_canc } button_box.pack_start (ok_button); - vbox.pack_start (_portinsertui); - vbox.pack_start (button_box, false, false); - - add (vbox); + get_vbox()->pack_start (_portinsertui); + get_vbox()->pack_start (button_box, false, false); ok_button.signal_clicked().connect (mem_fun(*this, &PortInsertWindow::accept)); cancel_button.signal_clicked().connect (mem_fun(*this, &PortInsertWindow::cancel)); rescan_button.signal_clicked().connect (mem_fun(*this, &PortInsertWindow::rescan)); - delete_event.connect (bind (ptr_fun (just_hide_it), reinterpret_cast (this))); - pi.GoingAway.connect (mem_fun(*this, &PortInsertWindow::plugin_going_away)); + signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), reinterpret_cast (this))); + pi->GoingAway.connect (mem_fun(*this, &PortInsertWindow::plugin_going_away)); } void -PortInsertWindow::plugin_going_away (ARDOUR::Redirect* ignored) +PortInsertWindow::plugin_going_away () { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &PortInsertWindow::plugin_going_away), ignored)); + ENSURE_GUI_THREAD(mem_fun(*this, &PortInsertWindow::plugin_going_away)); delete_when_idle (this); } -gint -PortInsertWindow::on_map (GdkEventAny *ev) +void +PortInsertWindow::on_map () { _portinsertui.redisplay (); - return Window::on_map (ev); + Window::on_map (); }