/*Keybinding setup (editor for .seq24rc keybindings).*/ void options::add_keyboard_page() { VBox *mainbox = manage(new VBox()); mainbox->set_spacing(6); m_notebook->append_page(*mainbox, "_Keyboard", true); Label* label; KeyBindEntry* entry; HBox *hbox = manage (new HBox()); CheckButton *check = manage(new CheckButton( "_Show key labels on sequences", true)); check->signal_toggled().connect(bind(mem_fun(*this, &options::input_callback), (int)e_keylabelsonsequence, check)); check->set_active(m_perf->m_show_ui_sequence_key); mainbox->pack_start(*check, false, false); /*Frame for sequence toggle keys*/ Frame* controlframe = manage(new Frame("Control keys")); controlframe->set_border_width(4); mainbox->pack_start(*controlframe, Gtk::PACK_SHRINK); Table* controltable = manage(new Table(4, 8, false)); controltable->set_border_width(4); controltable->set_spacings(4); controlframe->add(*controltable); label = manage(new Label("Start", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_start)); controltable->attach(*label, 0, 1, 0, 1); controltable->attach(*entry, 1, 2, 0, 1); label = manage(new Label("Stop", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_stop)); controltable->attach(*label, 0, 1, 1, 2); controltable->attach(*entry, 1, 2, 1, 2); label = manage(new Label("Song", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_song)); controltable->attach(*label, 0, 1, 2, 3); controltable->attach(*entry, 1, 2, 2, 3); #ifdef JACK_SUPPORT label = manage(new Label("Jack", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_jack)); controltable->attach(*label, 0, 1, 3, 4); controltable->attach(*entry, 1, 2, 3, 4); #endif // JACK_SUPPORT label = manage(new Label("Snapshot 1", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_snapshot_1)); controltable->attach(*label, 2, 3, 0, 1); controltable->attach(*entry, 3, 4, 0, 1); label = manage(new Label("Snapshot 2", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_snapshot_2)); controltable->attach(*label, 2, 3, 1, 2); controltable->attach(*entry, 3, 4, 1, 2); label = manage(new Label("bpm down", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_bpm_dn)); controltable->attach(*label, 2, 3, 3, 4); controltable->attach(*entry, 3, 4, 3, 4); label = manage(new Label("bpm up", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_bpm_up)); controltable->attach(*label, 2, 3, 2, 3); controltable->attach(*entry, 3, 4, 2, 3); label = manage(new Label("Replace", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_replace)); controltable->attach(*label, 4, 5, 0, 1); controltable->attach(*entry, 5, 6, 0, 1); label = manage(new Label("Queue", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_queue)); controltable->attach(*label, 4, 5, 1, 2); controltable->attach(*entry, 5, 6, 1, 2); label = manage(new Label("Keep queue", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_keep_queue)); controltable->attach(*label, 4, 5, 2, 3); controltable->attach(*entry, 5, 6, 2, 3); label = manage(new Label("Menu mode", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_menu)); controltable->attach(*label, 4, 5, 3, 4); controltable->attach(*entry, 5, 6, 3, 4); label = manage(new Label("Screenset up", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_screenset_up)); controltable->attach(*label, 6, 7, 0, 1); controltable->attach(*entry, 7, 8, 0, 1); label = manage(new Label("Screenset down", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_screenset_dn)); controltable->attach(*label, 6, 7, 1, 2); controltable->attach(*entry, 7, 8, 1, 2); label = manage(new Label("Set playing screenset", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_set_playing_screenset)); controltable->attach(*label, 6, 7, 2, 3); controltable->attach(*entry, 7, 8, 2, 3); label = manage(new Label("Follow transport", Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::location, &m_perf->m_key_follow_trans)); controltable->attach(*label, 6, 7, 3, 4); controltable->attach(*entry, 7, 8, 3, 4); /*Frame for sequence toggle keys*/ Frame* toggleframe = manage(new Frame("Sequence toggle keys")); toggleframe->set_border_width(4); mainbox->pack_start(*toggleframe, Gtk::PACK_SHRINK); Table* toggletable = manage(new Table(4, 16, false)); toggletable->set_border_width(4); toggletable->set_spacings(4); toggleframe->add(*toggletable); int x = 0; int y = 0; Label* numlabel; for (int i = 0; i < 32; i++) { x = i % 8 * 2; y = i / 8; int slot = x * 2 + y; // count this way: 0, 4, 8, 16... char buf[16]; snprintf(buf, sizeof(buf), "%d", slot); numlabel = manage(new Label(buf, Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::events, NULL, m_perf, slot)); toggletable->attach(*numlabel, x, x + 1, y, y + 1); toggletable->attach(*entry, x + 1, x + 2, y, y + 1); } /*Frame for mute group slots*/ Frame* mutegroupframe = manage(new Frame("Mute-group slots")); mutegroupframe->set_border_width(4); mainbox->pack_start(*mutegroupframe, Gtk::PACK_SHRINK); Table* mutegrouptable = manage(new Table(4, 16, false)); mutegrouptable->set_border_width(4); mutegrouptable->set_spacings(4); mutegroupframe->add(*mutegrouptable); for (int i = 0; i <32; i++) { x = i%8*2; y = i/8; char buf[16]; snprintf(buf, sizeof(buf), "%d", i); numlabel = manage(new Label(buf, Gtk::ALIGN_RIGHT)); entry = manage(new KeyBindEntry(KeyBindEntry::groups, NULL, m_perf, i)); mutegrouptable->attach(*numlabel, x, x + 1, y, y + 1); mutegrouptable->attach(*entry, x + 1, x + 2, y, y + 1); } #define AddKey(text, integer) \ label = manage(new Label(text)); \ hbox->pack_start(*label, false, false, 4); \ entry = manage(new KeyBindEntry(KeyBindEntry::location, &integer)); \ hbox->pack_start(*entry, false, false, 4); hbox = manage(new HBox()); AddKey("Learn (while pressing a mute-group key):", m_perf->m_key_group_learn); AddKey("Disable:", m_perf->m_key_group_off); AddKey("Enable:", m_perf->m_key_group_on); mainbox->pack_start (*hbox, false, false); #undef AddKey }
mainwnd::mainwnd(perform *a_p): m_mainperf(a_p), m_modified(false), m_options(NULL) { set_icon(Gdk::Pixbuf::create_from_xpm_data(seq24_32_xpm)); /*sjh stuff...*/ set_wsetlist_mode(m_mainperf->get_setlist_mode()); /*............*/ /* register for notification */ m_mainperf->m_notify.push_back( this ); /* main window */ update_window_title(); #if GTK_MINOR_VERSION < 12 m_tooltips = manage( new Tooltips() ); #endif m_main_wid = manage( new mainwid( m_mainperf )); m_main_time = manage( new maintime( )); m_menubar = manage(new MenuBar()); m_menu_file = manage(new Menu()); m_menubar->items().push_front(MenuElem("_File", *m_menu_file)); m_menu_view = manage( new Menu()); m_menubar->items().push_back(MenuElem("_View", *m_menu_view)); m_menu_help = manage( new Menu()); m_menubar->items().push_back(MenuElem("_Help", *m_menu_help)); /* file menu items */ m_menu_file->items().push_back(MenuElem("_New", Gtk::AccelKey("<control>N"), mem_fun(*this, &mainwnd::file_new))); m_menu_file->items().push_back(MenuElem("_Open...", Gtk::AccelKey("<control>O"), mem_fun(*this, &mainwnd::file_open))); m_menu_file->items().push_back(MenuElem("_Save", Gtk::AccelKey("<control>S"), mem_fun(*this, &mainwnd::file_save))); m_menu_file->items().push_back(MenuElem("Save _as...", mem_fun(*this, &mainwnd::file_save_as))); m_menu_file->items().push_back(MenuElem("Open _setlist...", mem_fun(*this, &mainwnd::file_open_setlist))); m_menu_file->items().push_back(SeparatorElem()); m_menu_file->items().push_back(MenuElem("_Import...", mem_fun(*this, &mainwnd::file_import_dialog))); m_menu_file->items().push_back(MenuElem("O_ptions...", mem_fun(*this,&mainwnd::options_dialog))); m_menu_file->items().push_back(SeparatorElem()); m_menu_file->items().push_back(MenuElem("E_xit", Gtk::AccelKey("<control>Q"), mem_fun(*this, &mainwnd::file_exit))); /* view menu items */ m_menu_view->items().push_back(MenuElem("_Song Editor...", Gtk::AccelKey("<control>E"), mem_fun(*this, &mainwnd::open_performance_edit))); /* help menu items */ m_menu_help->items().push_back(MenuElem("_About...", mem_fun(*this, &mainwnd::about_dialog))); /* top line items */ HBox *tophbox = manage( new HBox( false, 0 ) ); tophbox->pack_start( *m_s24_pic, // *manage(new Image(Gdk::Pixbuf::create_from_xpm_data(seq24_xpm))), false, false); // adjust placement... VBox *vbox_b = manage( new VBox() ); HBox *hbox3 = manage( new HBox( false, 0 ) ); vbox_b->pack_start( *hbox3, false, false ); tophbox->pack_end( *vbox_b, false, false ); hbox3->set_spacing( 10 ); /* timeline */ hbox3->pack_start( *m_main_time, false, false ); /* group learn button */ m_button_learn = manage( new Button( )); m_button_learn->set_focus_on_click( false ); m_button_learn->set_flags( m_button_learn->get_flags() & ~Gtk::CAN_FOCUS ); m_button_learn->set_image(*manage(new Image( Gdk::Pixbuf::create_from_xpm_data( learn_xpm )))); m_button_learn->signal_clicked().connect( mem_fun(*this, &mainwnd::learn_toggle)); add_tooltip( m_button_learn, "Mute Group Learn\n\n" "Click 'L' then press a mutegroup key to store the mute state of " "the sequences in that key.\n\n" "(see File/Options/Keyboard for available mutegroup keys " "and the corresponding hotkey for the 'L' button)" ); hbox3->pack_end( *m_button_learn, false, false ); /*this seems to be a dirty hack:*/ Button w; hbox3->set_focus_child( w ); // clear the focus not to trigger L via keys /* bottom line items */ HBox *bottomhbox = manage( new HBox(false, 10)); /* container for start+stop buttons */ HBox *startstophbox = manage(new HBox(false, 4)); bottomhbox->pack_start(*startstophbox, Gtk::PACK_SHRINK); /* stop button */ m_button_stop = manage( new Button()); m_button_stop->add(*manage(new Image( Gdk::Pixbuf::create_from_xpm_data( stop_xpm )))); m_button_stop->signal_clicked().connect( mem_fun(*this, &mainwnd::stop_playing));/*sjh - can't pass anything into the stop_playing function because of this. */ add_tooltip( m_button_stop, "Stop playing MIDI sequence" ); m_button_stop->set_can_focus(false); startstophbox->pack_start(*m_button_stop, Gtk::PACK_SHRINK); /* play button */ m_button_play = manage(new Button() ); m_button_play->add(*manage(new Image( Gdk::Pixbuf::create_from_xpm_data( play2_xpm )))); m_button_play->signal_clicked().connect( mem_fun( *this, &mainwnd::start_playing)); add_tooltip( m_button_play, "Play MIDI sequence" ); startstophbox->pack_start(*m_button_play, Gtk::PACK_SHRINK); /* bpm spin button with label*/ HBox *bpmhbox = manage(new HBox(false, 4)); bottomhbox->pack_start(*bpmhbox, Gtk::PACK_SHRINK); m_adjust_bpm = manage(new Adjustment(m_mainperf->get_bpm(), 20, 500, 1)); m_spinbutton_bpm = manage( new SpinButton( *m_adjust_bpm )); m_spinbutton_bpm->set_editable( false ); m_adjust_bpm->signal_value_changed().connect( mem_fun(*this, &mainwnd::adj_callback_bpm)); add_tooltip( m_spinbutton_bpm, "Adjust beats per minute (BPM) value"); Label* bpmlabel = manage(new Label("_bpm", true)); bpmlabel->set_mnemonic_widget(*m_spinbutton_bpm); bpmhbox->pack_start(*bpmlabel, Gtk::PACK_SHRINK); bpmhbox->pack_start(*m_spinbutton_bpm, Gtk::PACK_SHRINK); /* screen set name edit line */ HBox *notebox = manage(new HBox(false, 4)); bottomhbox->pack_start(*notebox, Gtk::PACK_EXPAND_WIDGET); m_entry_notes = manage( new Entry()); m_entry_notes->signal_changed().connect( mem_fun(*this, &mainwnd::edit_callback_notepad)); m_entry_notes->set_text(*m_mainperf->get_screen_set_notepad( m_mainperf->get_screenset())); add_tooltip( m_entry_notes, "Enter screen set name" ); Label* notelabel = manage(new Label("_Name", true)); notelabel->set_mnemonic_widget(*m_entry_notes); notebox->pack_start(*notelabel, Gtk::PACK_SHRINK); notebox->pack_start(*m_entry_notes, Gtk::PACK_EXPAND_WIDGET); /* sequence set spin button */ HBox *sethbox = manage(new HBox(false, 4)); bottomhbox->pack_start(*sethbox, Gtk::PACK_SHRINK); m_adjust_ss = manage( new Adjustment( 0, 0, c_max_sets - 1, 1 )); m_spinbutton_ss = manage( new SpinButton( *m_adjust_ss )); m_spinbutton_ss->set_editable( false ); m_spinbutton_ss->set_wrap( true ); m_adjust_ss->signal_value_changed().connect( mem_fun(*this, &mainwnd::adj_callback_ss )); add_tooltip( m_spinbutton_ss, "Select screen set" ); Label* setlabel = manage(new Label("_Set", true)); setlabel->set_mnemonic_widget(*m_spinbutton_ss); sethbox->pack_start(*setlabel, Gtk::PACK_SHRINK); sethbox->pack_start(*m_spinbutton_ss, Gtk::PACK_SHRINK); /* song edit button */ m_button_songedit = manage( new Button( )); m_button_songedit->add( *manage( new Image( Gdk::Pixbuf::create_from_xpm_data( perfedit_xpm )))); m_button_songedit->signal_clicked().connect( mem_fun( *this, &mainwnd::open_performance_edit )); add_tooltip( m_button_songedit, "Show or hide song editor window" ); bottomhbox->pack_end(*m_button_songedit, Gtk::PACK_SHRINK); /* vertical layout container for window content*/ VBox *contentvbox = new VBox(); contentvbox->set_spacing(10); contentvbox->set_border_width(10); contentvbox->pack_start(*tophbox, Gtk::PACK_SHRINK); contentvbox->pack_start(*m_main_wid, Gtk::PACK_SHRINK); contentvbox->pack_start(*bottomhbox, Gtk::PACK_SHRINK); /*main container for menu and window content */ VBox *mainvbox = new VBox(); mainvbox->pack_start(*m_menubar, false, false ); mainvbox->pack_start( *contentvbox ); /* add main layout box */ this->add (*mainvbox); /* show everything */ show_all(); add_events( Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK ); m_timeout_connect = Glib::signal_timeout().connect( mem_fun(*this, &mainwnd::timer_callback), 25); m_perf_edit = new perfedit( m_mainperf ); // m_playlist_wnd = new playlist_wnd( m_mainperf); m_playplay = new playlist_player(); m_sigpipe[0] = -1; m_sigpipe[1] = -1; install_signal_handlers(); }