#include #include #include "config.h" #include "jack.h" #include "portmanager.h" #include "gui.h" #include "session_gui.h" #include "preferences_gui.h" #define PACKAGE_NAME "jsweeper" Glib::RefPtr g_builder; Gui::Gui(BaseObjectType *cobject, const Glib::RefPtr &builder) : Gtk::Window(cobject), m_vbox(NULL), m_matrix_audio(NULL), m_matrix_midi(NULL), m_closing(false) { builder->get_widget("vbox1", m_vbox); SetPortTypeSeparation(); Refresh(); Glib::signal_timeout().connect(sigc::mem_fun(*this, &Gui::on_timeout), 50); if (!jack_set_port_rename_callback) { Glib::signal_timeout().connect(sigc::mem_fun(*this, &Gui::on_timeout_2), 1000); } Glib::RefPtr uim = Glib::RefPtr::cast_static(builder->get_object("uimanager1")); uim->get_action("/menubar1/menuitem1/menu_quit")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_quit)); uim->get_action("/menubar1/menuitem5/menu_session_open")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_open)); uim->get_action("/menubar1/menuitem5/menu_session_save")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_save)); uim->get_action("/menubar1/menuitem5/menu_session_save_as")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_save_as)); uim->get_action("/menubar1/menuitem5/menu_session_close")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_close)); uim->get_action("/menubar1/menuitem2/menu_preferences")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_preferences)); uim->get_action("/menubar1/menuitem3/menu_connect")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_connect)); uim->get_action("/menubar1/menuitem3/menu_disconnect")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_disconnect)); uim->get_action("/menubar1/menuitem4/menu_about")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_about)); } Gui::~Gui() { m_closing = true; delete m_matrix_audio; delete m_matrix_midi; } void Gui::SetPortTypeSeparation() { if (cfg.SeparateByPortType) { if (m_matrix_audio && m_matrix_midi) return; m_scrolledwindow_audio.remove(); m_scrolledwindow_midi.remove(); if (m_notebook.get_n_pages() > 0) { m_notebook.remove(m_scrolledwindow_audio); m_notebook.remove(m_scrolledwindow_midi); } if (m_vbox->children().size() == 3) { m_vbox->remove(m_scrolledwindow_audio); } delete m_matrix_audio; delete m_matrix_midi; m_matrix_audio = new Matrix(PT_AUDIO); m_matrix_midi = new Matrix(PT_MIDI); m_notebook.pages().clear(); m_notebook.pages().push_back( Gtk::Notebook_Helpers::TabElem(m_scrolledwindow_audio, "Audio")); m_scrolledwindow_audio.add(*m_matrix_audio); m_scrolledwindow_audio.show(); m_notebook.pages().push_back( Gtk::Notebook_Helpers::TabElem(m_scrolledwindow_midi, "MIDI")); m_scrolledwindow_midi.add(*m_matrix_midi); m_scrolledwindow_midi.show(); m_notebook.show(); m_notebook.signal_switch_page().connect(sigc::mem_fun(*this, &Gui::on_notebook_switch_page)); m_vbox->pack_start(m_notebook); } else { if (m_matrix_audio && !m_matrix_midi) return; m_scrolledwindow_audio.remove(); m_scrolledwindow_midi.remove(); if (m_notebook.pages().size() > 0) { m_notebook.remove(m_scrolledwindow_audio); m_notebook.remove(m_scrolledwindow_midi); } if (m_vbox->children().size() == 3) { m_vbox->remove(m_notebook); } delete m_matrix_audio; delete m_matrix_midi; m_matrix_audio = new Matrix(PT_ALL); m_matrix_midi = NULL; m_scrolledwindow_audio.add(*m_matrix_audio); m_scrolledwindow_audio.show(); m_vbox->pack_start(m_scrolledwindow_audio); } } static void TryLoad(const char *filename) { struct stat out; if (stat(filename, &out) == 0) { g_builder = Gtk::Builder::create_from_file(filename); } } Gui *Gui::Open() { if (!g_builder) { const char * const *dirs = g_get_system_data_dirs(); while (*dirs != NULL && !g_builder) { std::string path = *dirs; path = Glib::build_filename(path, PACKAGE_NAME); path = Glib::build_filename(path, "jsweeper.ui"); TryLoad(path.c_str()); dirs++; } if (!g_builder) TryLoad("jsweeper.ui"); if (!g_builder) { std::cerr << "Failed to load jsweeper.ui!" << std::endl; exit(-1); } } Gui *window = NULL; g_builder->get_widget_derived("window1", window); return window; } void Gui::Refresh() { if (m_closing) return; if (cfg.SeparateByPortType) { int page = m_notebook.get_current_page(); if (page == 0 && m_matrix_audio != NULL) m_matrix_audio->Refresh(); if (page == 1 && m_matrix_midi != NULL) m_matrix_midi->Refresh(); } else { if (m_matrix_audio != NULL) m_matrix_audio->Refresh(); } } bool Gui::on_timeout() { if (m_closing) return false; if (jack.ProcessEvents()) { Refresh(); queue_draw(); } return true; } bool Gui::on_timeout_2() { if (m_closing) return false; if (pm.PollPortRenames()) { Refresh(); queue_draw(); } return true; } void Gui::on_notebook_switch_page(GtkNotebookPage * /* page */, guint /* page_num */) { if (m_closing) return; Refresh(); } void Gui::on_quit() { hide(); } void Gui::on_session_open() { SessionOpenGui *sgui = SessionOpenGui::Open(); sgui->show(); } void Gui::on_session_save() { } void Gui::on_session_save_as() { SessionSaveGui *sgui = SessionSaveGui::Open(); sgui->show(); } void Gui::on_session_close() { } void Gui::on_preferences() { Preferences *p = Preferences::Open(); p->show(); } void Gui::on_connect() { jack.Connect(); Refresh(); } void Gui::on_disconnect() { jack.Disconnect(); Refresh(); } void Gui::on_about() { Gtk::AboutDialog *about; g_builder->get_widget("aboutdialog1", about); about->show(); }