diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 411b262e4d..36211a79e4 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -45,7 +45,6 @@ #ifdef GTKOSX - #endif @@ -276,10 +275,6 @@ -#ifndef GTKOSX - - -#endif diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 4d6a0a72d5..c738f494f2 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -261,9 +261,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , last_key_press_time (0) , save_as_dialog (0) , meterbridge (0) + , rc_option_editor (0) , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , key_editor (X_("key-editor"), _("Key Bindings")) - , rc_option_editor (X_("rc-options-editor"), _("Preferences")) , add_route_dialog (X_("add-routes"), _("Add Tracks/Busses")) , about (X_("about"), _("About")) , location_ui (X_("locations"), _("Locations")) @@ -408,7 +408,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) if (ui_xml) { key_editor.set_state (*ui_xml); - rc_option_editor.set_state (*ui_xml); + // rc_option_editor.set_state (*ui_xml); session_option_editor.set_state (*ui_xml); speaker_config_window.set_state (*ui_xml); about.set_state (*ui_xml); @@ -424,7 +424,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) } WM::Manager::instance().register_window (&key_editor); - WM::Manager::instance().register_window (&rc_option_editor); + // WM::Manager::instance().register_window (&rc_option_editor); WM::Manager::instance().register_window (&session_option_editor); WM::Manager::instance().register_window (&speaker_config_window); WM::Manager::instance().register_window (&about); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 33e4174b50..ddec14b1a1 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -320,6 +320,15 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void hide_application (); + Gtk::Notebook& tabs(); + + /* called from a static C function */ + + Gtk::Notebook* tab_window_root_drop (GtkNotebook* src, + GtkWidget* w, + gint x, + gint y, + gpointer user_data); protected: friend class PublicEditor; @@ -340,7 +349,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void toggle_session_options_window (); private: - PublicEditor* editor; Mixer_UI* mixer; NSM_Client* nsm; bool _was_dirty; @@ -619,15 +627,19 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void setup_order_hint (AddRouteDialog::InsertAt); int create_mixer (); + PublicEditor *editor; int create_editor (); Meterbridge *meterbridge; int create_meterbridge (); + + RCOptionEditor* rc_option_editor; + Gtk::HBox rc_option_editor_placeholder; + /* Dialogs that can be created via new */ WM::Proxy speaker_config_window; WM::Proxy key_editor; - WM::Proxy rc_option_editor; WM::Proxy add_route_dialog; WM::Proxy about; WM::Proxy location_ui; @@ -797,6 +809,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr DuplicateRouteDialog* duplicate_routes_dialog; void grab_focus_after_dialog (); + + void tabs_switch (GtkNotebookPage*, guint page_number); }; #endif /* __ardour_gui_h__ */ diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 3e8fde5dbb..554e955dbf 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -66,6 +66,22 @@ using namespace Gtk; using namespace Glib; using namespace ARDOUR_UI_UTILS; + +static GtkNotebook* +tab_window_root_drop (GtkNotebook* src, + GtkWidget* w, + gint x, + gint y, + gpointer user_data) +{ + Gtk::Notebook* nb = ARDOUR_UI::instance()->tab_window_root_drop (src, w, x, y, user_data); + if (nb) { + return nb->gobj(); + } else { + return 0; + } +} + int ARDOUR_UI::setup_windows () { @@ -112,6 +128,15 @@ ARDOUR_UI::setup_windows () editor->add_toplevel_menu (top_packer); editor->add_transport_frame (transport_frame); + editor->tabs().append_page (rc_option_editor_placeholder, _("Preferences")); + + editor->tabs().signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch)); + + /* It would be nice if Gtkmm had wrapped this rather than just + * deprecating the old set_window_creation_hook() method, but oh well... + */ + g_signal_connect (editor->tabs().gobj(), "create-window", + (GCallback) ::tab_window_root_drop, this); setup_transport(); @@ -122,6 +147,18 @@ ARDOUR_UI::setup_windows () return 0; } +void +ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page_number) +{ + if (page_number == 2) { + if (!rc_option_editor) { + rc_option_editor = new RCOptionEditor; + rc_option_editor_placeholder.pack_start (*rc_option_editor, true, true); + rc_option_editor_placeholder.show_all (); + } + } +} + void ARDOUR_UI::setup_tooltips () { @@ -696,11 +733,7 @@ ARDOUR_UI::restore_editing_space () void ARDOUR_UI::show_ui_prefs () { - RefPtr act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor")); - assert (act); - - act->activate(); - + tabs().set_current_page (2); rc_option_editor->set_current_page (_("GUI")); } @@ -713,11 +746,7 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev) return false; } - RefPtr act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor")); - assert (act); - - act->activate(); - + tabs().set_current_page (2); rc_option_editor->set_current_page (_("Misc")); return true; } diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index 7227d4f87f..41af709e2f 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -61,6 +61,9 @@ ARDOUR_UI::we_have_dependents () editor->setup_tooltips (); editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks)); + std::cerr << "Mixer page = " << editor->tabs().append_page (*mixer, _("Mixer")) << std::endl; + editor->tabs().set_tab_detachable (*mixer); + /* all actions are defined */ ActionManager::enable_accelerators (); @@ -101,3 +104,28 @@ ARDOUR_UI::exit_on_main_window_close (GdkEventAny * /*ev*/) #endif } +Gtk::Notebook* +ARDOUR_UI::tab_window_root_drop (GtkNotebook* src, + GtkWidget* w, + gint x, + gint y, + gpointer) +{ + using namespace std; + + if (w == GTK_WIDGET(mixer->gobj())) { + /* Mixer */ + + cerr << "Call use own window\n"; + + Gtk::Notebook* nb = mixer->use_own_window (); + Gtk::Window* win = (Gtk::Window*) nb->get_toplevel (); + + win->move (x, y); + win->present (); + + return nb; + } + + return 0; +} diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 859a167832..84959d1e51 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -366,11 +366,13 @@ ARDOUR_UI::goto_mixer_window () } mixer->show_window (); - mixer->present (); + + // mixer->present (); /* mixer should now be on top */ - if (UIConfiguration::instance().get_transients_follow_front()) { - WM::Manager::instance().set_transient_for (mixer); - } + //if (UIConfiguration::instance().get_transients_follow_front()) { + // WM::Manager::instance().set_transient_for (mixer); + //} + _mixer_on_top = true; } @@ -401,7 +403,7 @@ ARDOUR_UI::toggle_mixer_window () if (show) { goto_mixer_window (); } else { - mixer->hide (); + mixer->hide_window ((GdkEventAny*)0); } } @@ -549,7 +551,7 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) && (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { if (big_clock_window) { - big_clock_window->set_transient_for (*mixer); + // big_clock_window->set_transient_for (*mixer); } } } diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 8329ea35d2..1ba5f0bd5e 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -726,3 +726,9 @@ ARDOUR_UI::xrun_button_release (GdkEventButton* ev) } return true; } + +Gtk::Notebook& +ARDOUR_UI::tabs() +{ + return editor->tabs(); +} diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index f080ed24fb..836360b2ef 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -668,8 +668,11 @@ Editor::Editor () status_bar_hpacker.show (); + _tabs.append_page (global_hpacker, _("Editor")); + _tabs.show (); + vpacker.pack_end (status_bar_hpacker, false, false); - vpacker.pack_end (global_hpacker, true, true); + vpacker.pack_end (_tabs, true, true); /* register actions now so that set_state() can find them and set toggles/checks etc */ @@ -852,13 +855,9 @@ Editor::add_toplevel_menu (Container& cont) void Editor::add_transport_frame (Container& cont) { - if(ARDOUR::Profile->get_mixbus()) { - global_vpacker.pack_start (cont, false, false); - global_vpacker.reorder_child (cont, 0); - cont.show_all (); - } else { - vpacker.pack_start (cont, false, false); - } + global_vpacker.pack_start (cont, false, false); + global_vpacker.reorder_child (cont, 0); + cont.show_all (); } bool diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 7200cfd20f..3dde07be09 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -28,6 +28,7 @@ #include #include "pbd/convert.h" +#include "pbd/stacktrace.h" #include "pbd/unwind.h" #include @@ -36,6 +37,7 @@ #include #include #include +#include #include "ardour/amp.h" #include "ardour/debug.h" @@ -87,8 +89,7 @@ Mixer_UI::instance () } Mixer_UI::Mixer_UI () - : Window (Gtk::WINDOW_TOPLEVEL) - , VisibilityTracker (*((Gtk::Window*) this)) + : _parent_window (0) , _visible (false) , no_track_list_redisplay (false) , in_group_row_change (false) @@ -103,13 +104,10 @@ Mixer_UI::Mixer_UI () , _maximised (false) , _show_mixer_list (true) { - /* allow this window to become the key focus window */ - set_flags (CAN_FOCUS); - Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_order_keys, this), gui_context()); scroller.set_can_default (true); - set_default (scroller); + // set_default (scroller); scroller_base.set_flags (Gtk::CAN_FOCUS); scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); @@ -239,26 +237,21 @@ Mixer_UI::Mixer_UI () list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler), static_cast (&list_hpane))); - global_vpacker.pack_start (list_hpane, true, true); + pack_start (list_hpane, true, true); - add (global_vpacker); set_name ("MixerWindow"); update_title (); - set_wmclass (X_("ardour_mixer"), PROGRAM_NAME); - - signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window)); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); - signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); - route_group_display_button_box->show(); route_group_add_button->show(); route_group_remove_button->show(); + show (); + global_hpacker.show(); - global_vpacker.show(); scroller.show(); scroller_base.show(); scroller_hpacker.show(); @@ -310,14 +303,63 @@ Mixer_UI::track_editor_selection () void Mixer_UI::ensure_float (Window& win) { - win.set_transient_for (*this); + if (_parent_window) { + win.set_transient_for (*_parent_window); + } +} + +Gtk::Notebook* +Mixer_UI::use_own_window () +{ + /* This is called after a drop of a tab onto the root window. Its + * responsibility is to return the notebook that this Mixer_UI should + * be packed into before the drop handling is completed. It is not + * responsible for actually taking care of this packing + */ + + if (_parent_window) { + return 0; + } + + create_own_window (); + + return (Gtk::Notebook*) _parent_window->get_child(); +} + +void +Mixer_UI::create_own_window () +{ + if (_parent_window) { + return; + } + + _parent_window = new Window (Gtk::WINDOW_TOPLEVEL); + Notebook* notebook = manage (new Notebook); + + notebook->set_show_tabs (false); + notebook->show_all (); + + _parent_window->add (*notebook); + + /* allow parent window to become the key focus window */ + _parent_window->set_flags (CAN_FOCUS); + + /* handle window manager close/delete event sensibly */ + _parent_window->signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window)); + + set_window_pos_and_size (); + update_title (); } void Mixer_UI::show_window () { - present (); - if (!_visible) { + if (_parent_window) { + _parent_window->present (); + } + + if (!_visible) { /* was hidden, update status */ + set_window_pos_and_size (); /* show/hide group tabs as required */ @@ -337,19 +379,43 @@ Mixer_UI::show_window () } } + if (!_parent_window) { + /* not in its own window, just switch main tabs to show mixer */ + int pagenum = ARDOUR_UI::instance()->tabs().page_num (*this); + ARDOUR_UI::instance()->tabs().set_current_page (pagenum); + } + /* force focus into main area */ scroller_base.grab_focus (); - _visible = true; } bool Mixer_UI::hide_window (GdkEventAny *ev) { - get_window_pos_and_size (); + if (_parent_window) { + /* unpack Mixer_UI from parent, put it back in the main tabbed + * notebook + */ + + get_window_pos_and_size (); + + get_parent()->remove (*this); + ARDOUR_UI::instance()->tabs().insert_page (*this, _("Mixer"), 1); + ARDOUR_UI::instance()->tabs().set_tab_detachable (*this); + ARDOUR_UI::instance()->tabs().set_current_page (0); + + show_all (); + + delete_when_idle (_parent_window); + _parent_window = 0; + } + + ARDOUR_UI::instance()->tabs().set_current_page (0); _visible = false; - return just_hide_it(ev, static_cast(this)); + + return true; } @@ -1479,15 +1545,15 @@ Mixer_UI::show_mixer_list (bool yn) { if (yn) { list_vpacker.show (); - - //if user wants to show the pane, we should make sure that it is wide enough to be visible + + //if user wants to show the pane, we should make sure that it is wide enough to be visible int width = list_hpane.get_position(); if (width < 40) list_hpane.set_position(40); } else { list_vpacker.hide (); } - + _show_mixer_list = yn; } @@ -1616,7 +1682,7 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev) using namespace Menu_Helpers; if (Keyboard::is_context_menu_event (ev)) { - ARDOUR_UI::instance()->add_route (this); + // ARDOUR_UI::instance()->add_route (this); return true; } @@ -1636,15 +1702,19 @@ Mixer_UI::set_strip_width (Width w, bool save) void Mixer_UI::set_window_pos_and_size () { - resize (m_width, m_height); - move (m_root_x, m_root_y); + if (_parent_window) { + _parent_window->resize (m_width, m_height); + _parent_window->move (m_root_x, m_root_y); + } } void Mixer_UI::get_window_pos_and_size () { - get_position(m_root_x, m_root_y); - get_size(m_width, m_height); + if (_parent_window) { + _parent_window->get_position(m_root_x, m_root_y); + _parent_window->get_size(m_width, m_height); + } } struct PluginStateSorter { @@ -1682,6 +1752,16 @@ Mixer_UI::set_state (const XMLNode& node) if ((geometry = find_named_node (node, "geometry")) != 0) { + /* if there's a geometry node, we have our own window */ + + create_own_window (); + Gtk::Notebook* notebook = (Gtk::Notebook*) _parent_window->get_child(); + Gtk::Widget* parent = get_parent(); + if (parent) { + ((Gtk::Container*)parent)->remove (*this); + } + notebook->append_page (*this, _("Mixer")); + XMLProperty* prop; if ((prop = geometry->property("x_size")) == 0) { @@ -1735,8 +1815,7 @@ Mixer_UI::set_state (const XMLNode& node) Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); bool fs = tact && tact->get_active(); if (yn ^ fs) { - ActionManager::do_action ("Common", - "ToggleMaximalMixer"); + ActionManager::do_action ("Common", "ToggleMaximalMixer"); } } @@ -1771,7 +1850,6 @@ Mixer_UI::set_state (const XMLNode& node) favorite_order.sort (cmp); sync_treeview_from_favorite_order (); } - return 0; } @@ -1780,8 +1858,8 @@ Mixer_UI::get_state (void) { XMLNode* node = new XMLNode ("Mixer"); - if (is_realized()) { - Glib::RefPtr win = get_window(); + if (_parent_window && _parent_window->is_realized() ) { + Glib::RefPtr win = _parent_window->get_window(); get_window_pos_and_size (); @@ -1928,30 +2006,25 @@ Mixer_UI::scroll_right () bool Mixer_UI::on_key_press_event (GdkEventKey* ev) { - /* focus widget gets first shot, then bindings, otherwise - forward to main window - */ - - if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) { - return true; - } - KeyboardKey k (ev->state, ev->keyval); if (bindings.activate (k, Bindings::Press)) { return true; } - return forward_key_press (ev); + if (_parent_window) { + /* send it to the main window, since our own bindings didn't + * handle it + */ + return forward_key_press (ev); + } + + return false; } bool Mixer_UI::on_key_release_event (GdkEventKey* ev) { - if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) { - return true; - } - KeyboardKey k (ev->state, ev->keyval); if (bindings.activate (k, Bindings::Release)) { @@ -2091,7 +2164,7 @@ Mixer_UI::setup_track_display () void Mixer_UI::new_track_or_bus () { - ARDOUR_UI::instance()->add_route (this); + // ARDOUR_UI::instance()->add_route (this); } @@ -2111,16 +2184,20 @@ Mixer_UI::update_title () n = "*" + n; } - WindowTitle title (n); - title += S_("Window|Mixer"); - title += Glib::get_application_name (); - set_title (title.get_string()); + if (own_window()) { + WindowTitle title (n); + title += S_("Window|Mixer"); + title += Glib::get_application_name (); + own_window()->set_title (title.get_string()); + } } else { - WindowTitle title (S_("Window|Mixer")); - title += Glib::get_application_name (); - set_title (title.get_string()); + if (own_window()) { + WindowTitle title (S_("Window|Mixer")); + title += Glib::get_application_name (); + own_window()->set_title (title.get_string()); + } } } @@ -2194,9 +2271,12 @@ Mixer_UI::maximise_mixer_space () return; } - fullscreen (); + Gtk::Window* win = (Gtk::Window*) get_toplevel(); - _maximised = true; + if (win) { + win->fullscreen (); + _maximised = true; + } } void @@ -2206,9 +2286,12 @@ Mixer_UI::restore_mixer_space () return; } - unfullscreen(); + Gtk::Window* win = (Gtk::Window*) get_toplevel(); - _maximised = false; + if (win) { + win->unfullscreen(); + _maximised = false; + } } void diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index a909228b06..8e4eab1979 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -42,10 +42,13 @@ #include "ardour/plugin.h" #include "ardour/plugin_manager.h" +<<<<<<< HEAD #include "gtkmm2ext/visibility_tracker.h" #include "gtkmm2ext/dndtreeview.h" #include "gtkmm2ext/treeutils.h" +======= +>>>>>>> the basics of tabbed #include "enums.h" #include "mixer_actor.h" @@ -59,6 +62,7 @@ class PluginSelector; class MixerGroupTabs; class MonitorSection; +<<<<<<< HEAD class PluginTreeStore : public Gtk::TreeStore { public: @@ -73,11 +77,19 @@ protected: }; class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor, public Gtkmm2ext::VisibilityTracker +======= +class Mixer_UI : public Gtk::VBox, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor +>>>>>>> the basics of tabbed { public: static Mixer_UI* instance(); ~Mixer_UI(); + Gtk::Window* own_window() const { return _parent_window; } + Gtk::Notebook* use_own_window(); + + bool visible() const { return _visible; } + void set_session (ARDOUR::Session *); void track_editor_selection (); @@ -119,6 +131,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR Mixer_UI (); static Mixer_UI* _instance; + Gtk::Window* _parent_window; bool _visible; Gtk::HBox global_hpacker; @@ -347,6 +360,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR void monitor_section_going_away (); +<<<<<<< HEAD void monitor_section_attached (); void monitor_section_detached (); @@ -357,6 +371,10 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR void sync_treeview_favorite_ui_state (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&); void save_favorite_ui_state (const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path); +======= + void create_own_window (); + +>>>>>>> the basics of tabbed /// true if we are in fullscreen mode bool _maximised; diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index df7dd6fe0d..e71e9d493f 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -171,7 +171,8 @@ This mode provides many different operations on both regions and control points, @wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog @trans|Editor/set-playhead|p|set playhead position @select|Editor/select-all-before-playhead|<@PRIMARY@>p|all before playhead -@wvis|Window/toggle-rc-options-editor|<@SECONDARY@>p|toggle preferences dialog +@wvis|Window/toggle-audio-connection-manager|<@WINDOW@>p|toggle global audio patchbay +@wvis|Window/toggle-midi-connection-manager|<@WINDOW@><@TERTIARY@>p|toggle global midi patchbay @midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc) @select|Editor/select-all-after-playhead|<@PRIMARY@><@TERTIARY@>p|all after playhead diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index e963726531..103aa89a12 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -470,25 +470,19 @@ OptionEditorPage::OptionEditorPage (Gtk::Notebook& n, std::string const & t) * @param t Title for the dialog. */ OptionEditor::OptionEditor (PBD::Configuration* c, std::string const & t) - : ArdourWindow (t), _config (c) + : _config (c) { using namespace Notebook_Helpers; - set_default_size (300, 300); - // set_wmclass (X_("ardour_preferences"), PROGRAM_NAME); - - set_name ("Preferences"); - add_events (Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); - set_border_width (4); - add (_notebook); + pack_start (_notebook, true, true); _notebook.set_show_tabs (true); _notebook.set_show_border (true); _notebook.set_name ("OptionsNotebook"); - show_all_children(); + show_all (); /* Watch out for changes to parameters */ _config->ParameterChanged.connect (config_connection, invalidator (*this), boost::bind (&OptionEditor::parameter_changed, this, _1), gui_context()); diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 76370619aa..0823d16630 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -680,7 +680,7 @@ public: }; /** The OptionEditor dialog base class */ -class OptionEditor : public ArdourWindow +class OptionEditor : public Gtk::VBox, public ARDOUR::SessionHandlePtr { public: OptionEditor (PBD::Configuration *, std::string const &); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index bcf98dbac4..90ee30dbca 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "evoral/Note.hpp" @@ -441,7 +442,11 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi PBD::Signal0 SnapChanged; PBD::Signal0 MouseModeChanged; + Gtk::Notebook& tabs() { return _tabs; } + protected: + Gtk::Notebook _tabs; + friend class DisplaySuspender; virtual void suspend_route_redisplay () = 0; virtual void resume_route_redisplay () = 0; diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 421e4c56c2..ee5ebd4594 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -76,7 +76,7 @@ using namespace ARDOUR_UI_UTILS; class ClickOptions : public OptionEditorBox { public: - ClickOptions (RCConfiguration* c, Gtk::Window* p) + ClickOptions (RCConfiguration* c) : _rc_config (c) , _click_browse_button (_("Browse...")) , _click_emphasis_browse_button (_("Browse...")) @@ -1343,9 +1343,8 @@ private: class ControlSurfacesOptions : public OptionEditorBox { public: - ControlSurfacesOptions (Gtk::Window& parent) - : _parent (parent) - , _ignore_view_change (0) + ControlSurfacesOptions () + : _ignore_view_change (0) { _store = ListStore::create (_model); _view.set_model (_store); @@ -1496,7 +1495,8 @@ private: * or re-initializing a surface. * tear_down_gui() hides an deletes the Window if it exists. */ - ArdourWindow* win = new ArdourWindow (_parent, title.get_string()); + ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string()); + win->set_title ("Control Protocol Options"); win->add (*box); box->show (); win->present (); @@ -1532,7 +1532,6 @@ private: Glib::RefPtr _store; ControlSurfacesModelColumns _model; TreeView _view; - Gtk::Window& _parent; PBD::ScopedConnection protocol_status_connection; uint32_t _ignore_view_change; Gtk::Button* edit_button; @@ -1800,7 +1799,7 @@ RCOptionEditor::RCOptionEditor () add_option (_("Misc"), new OptionEditorHeading (_("Click"))); - add_option (_("Misc"), new ClickOptions (_rc_config, this)); + add_option (_("Misc"), new ClickOptions (_rc_config)); add_option (_("Misc"), new FaderOption ( @@ -2710,7 +2709,7 @@ if (!Profile->get_mixbus()) { /* Control Surfaces */ - add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this)); + add_option (_("Control Surfaces"), new ControlSurfacesOptions); ComboOption* rm = new ComboOption ( "remote-model",