2 Copyright (C) 20002-2004 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 /* This file contains any ARDOUR_UI methods that require knowledge of
22 the editor, and exists so that no compilation dependency exists
23 between the main ARDOUR_UI modules and the PublicEditor class. This
24 is to cut down on the nasty compile times for both these classes.
27 #include <pbd/pathscanner.h>
29 #include "ardour_ui.h"
30 #include "public_editor.h"
31 #include "audio_clock.h"
35 #include <ardour/session.h>
36 #include <ardour/control_protocol_manager.h>
38 #include <control_protocol/control_protocol.h>
42 using namespace ARDOUR;
45 using namespace Gtkmm2ext;
48 ARDOUR_UI::create_editor ()
52 editor = new Editor (*engine);
55 catch (failed_constructor& err) {
59 editor->Realized.connect (mem_fun (*this, &ARDOUR_UI::editor_realized));
65 ARDOUR_UI::install_actions ()
67 Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
68 Glib::RefPtr<Action> act;
70 /* menus + submenus that need action items */
72 ActionManager::register_action (main_actions, X_("Session"), _("Session"));
73 ActionManager::register_action (main_actions, X_("Export"), _("Export"));
74 ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
75 ActionManager::register_action (main_actions, X_("Sync"), _("Sync"));
76 ActionManager::register_action (main_actions, X_("Options"), _("Options"));
77 ActionManager::register_action (main_actions, X_("TransportOptions"), _("Options"));
78 ActionManager::register_action (main_actions, X_("Help"), _("Help"));
79 ActionManager::register_action (main_actions, X_("KeyMouse Actions"), _("KeyMouse Actions"));
80 ActionManager::register_action (main_actions, X_("AudioFileFormat"), _("Audio File Format"));
81 ActionManager::register_action (main_actions, X_("AudioFileFormatHeader"), _("Header"));
82 ActionManager::register_action (main_actions, X_("AudioFileFormatData"), _("Data"));
83 ActionManager::register_action (main_actions, X_("ControlSurfaces"), _("Control Surfaces"));
85 /* the real actions */
87 act = ActionManager::register_action (main_actions, X_("New"), _("New"), bind (mem_fun(*this, &ARDOUR_UI::new_session), false, string ()));
89 ActionManager::register_action (main_actions, X_("Open"), _("Open"), mem_fun(*this, &ARDOUR_UI::open_session));
90 ActionManager::register_action (main_actions, X_("Recent"), _("Recent"), mem_fun(*this, &ARDOUR_UI::open_recent_session));
91 act = ActionManager::register_action (main_actions, X_("Close"), _("Close"), mem_fun(*this, &ARDOUR_UI::close_session));
92 ActionManager::session_sensitive_actions.push_back (act);
94 act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus"), mem_fun(*this, &ARDOUR_UI::add_route));
95 ActionManager::session_sensitive_actions.push_back (act);
101 vector<string*>* results = scanner (getenv ("PATH"), "AniComp", false, false);
104 if (!results->empty()) {
105 act = ActionManager::register_action (main_actions, X_("aniConnect"), _("Connect"), (mem_fun (*editor, &PublicEditor::connect_to_image_compositor)));
106 ActionManager::session_sensitive_actions.push_back (act);
111 /* </CMT Additions> */
113 act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot"), mem_fun(*this, &ARDOUR_UI::snapshot_session));
114 ActionManager::session_sensitive_actions.push_back (act);
116 act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."), mem_fun(*this, &ARDOUR_UI::save_template));
117 ActionManager::session_sensitive_actions.push_back (act);
119 act = ActionManager::register_action (main_actions, X_("ExportSession"), _("Export session to audiofile..."), mem_fun (*editor, &PublicEditor::export_session));
120 ActionManager::session_sensitive_actions.push_back (act);
122 act = ActionManager::register_action (main_actions, X_("ExportSelection"), _("Export selection to audiofile..."), mem_fun (*editor, &PublicEditor::export_selection));
123 ActionManager::session_sensitive_actions.push_back (act);
124 ActionManager::time_selection_sensitive_actions.push_back (act);
126 act = ActionManager::register_action (main_actions, X_("ExportRangeMarkers"), _("Export range markers to audiofile..."), mem_fun (*editor, &PublicEditor::export_range_markers));
127 ActionManager::session_sensitive_actions.push_back (act);
128 ActionManager::range_sensitive_actions.push_back (act);
130 act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
131 ActionManager::session_sensitive_actions.push_back (act);
133 act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Cleanup unused sources"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
134 ActionManager::session_sensitive_actions.push_back (act);
135 act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush wastebasket"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
136 ActionManager::session_sensitive_actions.push_back (act);
138 /* JACK actions for controlling ... JACK */
140 Glib::RefPtr<ActionGroup> jack_actions = ActionGroup::create (X_("JACK"));
141 ActionManager::register_action (jack_actions, X_("JACK"), _("JACK"));
142 ActionManager::register_action (jack_actions, X_("Latency"), _("Latency"));
144 act = ActionManager::register_action (jack_actions, X_("JACKReconnect"), _("Reconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::reconnect_to_jack));
145 ActionManager::jack_opposite_sensitive_actions.push_back (act);
147 act = ActionManager::register_action (jack_actions, X_("JACKDisconnect"), _("Disconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::disconnect_from_jack));
148 ActionManager::jack_sensitive_actions.push_back (act);
150 RadioAction::Group jack_latency_group;
152 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency32"), X_("32"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 32));
153 ActionManager::jack_sensitive_actions.push_back (act);
154 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency64"), X_("64"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 64));
155 ActionManager::jack_sensitive_actions.push_back (act);
156 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency128"), X_("128"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 128));
157 ActionManager::jack_sensitive_actions.push_back (act);
158 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency256"), X_("256"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 256));
159 ActionManager::jack_sensitive_actions.push_back (act);
160 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency512"), X_("512"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 512));
161 ActionManager::jack_sensitive_actions.push_back (act);
162 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency1024"), X_("1024"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 1024));
163 ActionManager::jack_sensitive_actions.push_back (act);
164 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency2048"), X_("2048"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 2048));
165 ActionManager::jack_sensitive_actions.push_back (act);
166 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency4096"), X_("4096"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 4096));
167 ActionManager::jack_sensitive_actions.push_back (act);
168 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency8192"), X_("8192"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (jack_nframes_t) 8192));
169 ActionManager::jack_sensitive_actions.push_back (act);
171 /* these actions are intended to be shared across all windows */
173 common_actions = ActionGroup::create (X_("Common"));
174 ActionManager::register_action (main_actions, X_("Windows"), _("Windows"));
175 ActionManager::register_action (common_actions, X_("Start-Prefix"), _("start prefix"), mem_fun(*this, &ARDOUR_UI::start_keyboard_prefix));
176 ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (mem_fun(*this, &ARDOUR_UI::finish)));
178 /* windows visibility actions */
180 ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
182 ActionManager::register_action (common_actions, X_("goto-editor"), _("Show Editor"), mem_fun(*this, &ARDOUR_UI::goto_editor_window));
183 ActionManager::register_action (common_actions, X_("goto-mixer"), _("Show Mixer"), mem_fun(*this, &ARDOUR_UI::goto_mixer_window));
184 ActionManager::register_toggle_action (common_actions, X_("ToggleSoundFileBrowser"), _("Sound File Browser"), mem_fun(*this, &ARDOUR_UI::toggle_sound_file_browser));
185 ActionManager::register_toggle_action (common_actions, X_("ToggleOptionsEditor"), _("Options Editor"), mem_fun(*this, &ARDOUR_UI::toggle_options_window));
186 act = ActionManager::register_toggle_action (common_actions, X_("ToggleInspector"), _("Track/Bus Inspector"), mem_fun(*this, &ARDOUR_UI::toggle_route_params_window));
187 ActionManager::session_sensitive_actions.push_back (act);
188 act = ActionManager::register_toggle_action (common_actions, X_("ToggleConnections"), _("Connections"), mem_fun(*this, &ARDOUR_UI::toggle_connection_editor));
189 ActionManager::session_sensitive_actions.push_back (act);
190 act = ActionManager::register_toggle_action (common_actions, X_("ToggleLocations"), _("Locations"), mem_fun(*this, &ARDOUR_UI::toggle_location_window));
191 ActionManager::session_sensitive_actions.push_back (act);
192 act = ActionManager::register_toggle_action (common_actions, X_("ToggleBigClock"), _("Big Clock"), mem_fun(*this, &ARDOUR_UI::toggle_big_clock_window));
193 ActionManager::session_sensitive_actions.push_back (act);
194 act = ActionManager::register_action (common_actions, X_("About"), _("About"), mem_fun(*this, &ARDOUR_UI::show_splash));
195 act = ActionManager::register_toggle_action (common_actions, X_("ToggleColorManager"), _("Colors"), mem_fun(*this, &ARDOUR_UI::toggle_color_manager));
196 ActionManager::session_sensitive_actions.push_back (act);
197 act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal));
198 ActionManager::session_sensitive_actions.push_back (act);
199 act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1));
200 ActionManager::session_sensitive_actions.push_back (act);
201 act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), (mem_fun(*this, &ARDOUR_UI::session_add_midi_track)));
202 ActionManager::session_sensitive_actions.push_back (act);
203 act = ActionManager::register_action (common_actions, X_("AddMidiBus"), _("Add Midi Bus"), mem_fun(*this, &ARDOUR_UI::session_add_midi_bus));
204 ActionManager::session_sensitive_actions.push_back (act);
205 act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
206 ActionManager::session_sensitive_actions.push_back (act);
207 act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), mem_fun(*this, &ARDOUR_UI::remove_last_capture));
208 ActionManager::session_sensitive_actions.push_back (act);
210 Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
212 /* do-nothing action for the "transport" menu bar item */
214 ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
216 /* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
217 menus and via button proxies.
220 act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), mem_fun(*this, &ARDOUR_UI::transport_stop));
221 ActionManager::session_sensitive_actions.push_back (act);
222 ActionManager::transport_sensitive_actions.push_back (act);
223 act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), mem_fun(*this, &ARDOUR_UI::transport_roll));
224 ActionManager::session_sensitive_actions.push_back (act);
225 ActionManager::transport_sensitive_actions.push_back (act);
227 ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false));
228 ActionManager::session_sensitive_actions.push_back (act);
229 ActionManager::transport_sensitive_actions.push_back (act);
230 ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true));
231 ActionManager::session_sensitive_actions.push_back (act);
232 ActionManager::transport_sensitive_actions.push_back (act);
233 act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
234 ActionManager::session_sensitive_actions.push_back (act);
235 ActionManager::transport_sensitive_actions.push_back (act);
236 act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), mem_fun(*this, &ARDOUR_UI::transport_play_selection));
237 ActionManager::session_sensitive_actions.push_back (act);
238 ActionManager::transport_sensitive_actions.push_back (act);
240 act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), mem_fun(*this, &ARDOUR_UI::transport_record));
241 ActionManager::session_sensitive_actions.push_back (act);
242 ActionManager::transport_sensitive_actions.push_back (act);
243 act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
244 ActionManager::session_sensitive_actions.push_back (act);
245 ActionManager::transport_sensitive_actions.push_back (act);
246 act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
247 ActionManager::session_sensitive_actions.push_back (act);
248 ActionManager::transport_sensitive_actions.push_back (act);
249 act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
250 ActionManager::session_sensitive_actions.push_back (act);
251 ActionManager::transport_sensitive_actions.push_back (act);
252 act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
253 ActionManager::session_sensitive_actions.push_back (act);
254 ActionManager::transport_sensitive_actions.push_back (act);
255 act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
256 ActionManager::session_sensitive_actions.push_back (act);
257 ActionManager::transport_sensitive_actions.push_back (act);
258 act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
259 ActionManager::session_sensitive_actions.push_back (act);
260 ActionManager::transport_sensitive_actions.push_back (act);
261 act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Goto Zero"), mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
262 ActionManager::session_sensitive_actions.push_back (act);
263 ActionManager::transport_sensitive_actions.push_back (act);
264 act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Goto Start"), mem_fun(*this, &ARDOUR_UI::transport_goto_start));
265 ActionManager::session_sensitive_actions.push_back (act);
266 ActionManager::transport_sensitive_actions.push_back (act);
267 act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Goto End"), mem_fun(*this, &ARDOUR_UI::transport_goto_end));
268 ActionManager::session_sensitive_actions.push_back (act);
269 ActionManager::transport_sensitive_actions.push_back (act);
271 /* XXX the newline in the displayed names of these action is really wrong, but its because we want the button
272 that proxies for these action to be more compact. It would be nice to find a way to override the action
273 name appearance on the buttons.
276 act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch\nin"), mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
277 ActionManager::session_sensitive_actions.push_back (act);
278 ActionManager::transport_sensitive_actions.push_back (act);
279 act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch\nout"), mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
280 ActionManager::session_sensitive_actions.push_back (act);
281 ActionManager::transport_sensitive_actions.push_back (act);
282 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), mem_fun(*this, &ARDOUR_UI::toggle_click));
283 ActionManager::session_sensitive_actions.push_back (act);
284 ActionManager::transport_sensitive_actions.push_back (act);
285 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto\ninput"), mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
286 ActionManager::session_sensitive_actions.push_back (act);
287 ActionManager::transport_sensitive_actions.push_back (act);
288 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto\nplay"), mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
289 ActionManager::session_sensitive_actions.push_back (act);
290 ActionManager::transport_sensitive_actions.push_back (act);
291 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto\nreturn"), mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
292 ActionManager::session_sensitive_actions.push_back (act);
293 ActionManager::transport_sensitive_actions.push_back (act);
295 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time\nmaster"), mem_fun(*this, &ARDOUR_UI::toggle_time_master));
296 ActionManager::session_sensitive_actions.push_back (act);
298 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 0U));
299 ActionManager::session_sensitive_actions.push_back (act);
300 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 1U));
301 ActionManager::session_sensitive_actions.push_back (act);
302 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 2U));
303 ActionManager::session_sensitive_actions.push_back (act);
304 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 3U));
305 ActionManager::session_sensitive_actions.push_back (act);
306 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 4U));
307 ActionManager::session_sensitive_actions.push_back (act);
308 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 5U));
309 ActionManager::session_sensitive_actions.push_back (act);
310 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 6U));
311 ActionManager::session_sensitive_actions.push_back (act);
312 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 7U));
313 ActionManager::session_sensitive_actions.push_back (act);
314 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 8U));
315 ActionManager::session_sensitive_actions.push_back (act);
316 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U));
317 ActionManager::session_sensitive_actions.push_back (act);
318 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U));
319 ActionManager::session_sensitive_actions.push_back (act);
320 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U));
321 ActionManager::session_sensitive_actions.push_back (act);
322 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U));
323 ActionManager::session_sensitive_actions.push_back (act);
324 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U));
325 ActionManager::session_sensitive_actions.push_back (act);
326 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U));
327 ActionManager::session_sensitive_actions.push_back (act);
328 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U));
329 ActionManager::session_sensitive_actions.push_back (act);
330 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U));
331 ActionManager::session_sensitive_actions.push_back (act);
332 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U));
333 ActionManager::session_sensitive_actions.push_back (act);
334 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U));
335 ActionManager::session_sensitive_actions.push_back (act);
336 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U));
337 ActionManager::session_sensitive_actions.push_back (act);
338 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U));
339 ActionManager::session_sensitive_actions.push_back (act);
340 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U));
341 ActionManager::session_sensitive_actions.push_back (act);
342 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U));
343 ActionManager::session_sensitive_actions.push_back (act);
344 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U));
345 ActionManager::session_sensitive_actions.push_back (act);
346 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U));
347 ActionManager::session_sensitive_actions.push_back (act);
348 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U));
349 ActionManager::session_sensitive_actions.push_back (act);
350 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U));
351 ActionManager::session_sensitive_actions.push_back (act);
352 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U));
353 ActionManager::session_sensitive_actions.push_back (act);
354 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U));
355 ActionManager::session_sensitive_actions.push_back (act);
356 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U));
357 ActionManager::session_sensitive_actions.push_back (act);
358 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U));
359 ActionManager::session_sensitive_actions.push_back (act);
360 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U));
361 ActionManager::session_sensitive_actions.push_back (act);
363 Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
365 shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
366 shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
368 Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
370 act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
371 ActionManager::session_sensitive_actions.push_back (act);
372 act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
373 ActionManager::session_sensitive_actions.push_back (act);
374 act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
375 ActionManager::session_sensitive_actions.push_back (act);
376 act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
377 ActionManager::session_sensitive_actions.push_back (act);
378 act = ActionManager::register_toggle_action (option_actions, X_("UseMIDIcontrol"), _("Use MIDI control"), mem_fun (*this, &ARDOUR_UI::toggle_use_midi_control));
379 ActionManager::session_sensitive_actions.push_back (act);
381 act = ActionManager::register_toggle_action (option_actions, X_("AutoConnectNewTrackInputsToHardware"), _("Connect new track inputs to hardware"), mem_fun (*this, &ARDOUR_UI::toggle_AutoConnectNewTrackInputsToHardware));
382 ActionManager::session_sensitive_actions.push_back (act);
384 RadioAction::Group file_header_group;
386 act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatBWF"), X_("Broadcast WAVE"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::BWF));
387 act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatWAVE"), X_("WAVE"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::WAVE));
388 act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatWAVE64"), X_("WAVE-64"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::WAVE64));
389 // act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatiXML"), X_("iXML"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::iXML));
390 // act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatRF64"), X_("RF64"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::RF64));
391 act = ActionManager::register_radio_action (option_actions, file_header_group, X_("FileHeaderFormatCAF"), X_("CAF"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_header_format), ARDOUR::CAF));
393 RadioAction::Group file_data_group;
395 act = ActionManager::register_radio_action (option_actions, file_data_group, X_("FileDataFormatFloat"), X_("32-bit floating point"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_data_format), ARDOUR::FormatFloat));
396 act = ActionManager::register_radio_action (option_actions, file_data_group, X_("FileDataFormat24bit"), X_("24-bit signed integer"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_data_format), ARDOUR::FormatInt24));
398 RadioAction::Group connect_outputs_group;
400 act = ActionManager::register_radio_action (option_actions, connect_outputs_group, X_("AutoConnectNewTrackOutputsToHardware"), _("Connect new track outputs to hardware"), mem_fun (*this, &ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToHardware));
401 ActionManager::session_sensitive_actions.push_back (act);
402 act = ActionManager::register_radio_action (option_actions, connect_outputs_group, X_("AutoConnectNewTrackOutputsToMaster"), _("Connect new track outputs to master"), mem_fun (*this, &ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToMaster));
403 ActionManager::session_sensitive_actions.push_back (act);
404 act = ActionManager::register_radio_action (option_actions, connect_outputs_group, X_("ManuallyConnectNewTrackOutputs"), _("Manually connect new track outputs"), mem_fun (*this, &ARDOUR_UI::toggle_ManuallyConnectNewTrackOutputs));
405 ActionManager::session_sensitive_actions.push_back (act);
407 RadioAction::Group monitoring_group;
409 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseHardwareMonitoring"), _("Hardware monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseHardwareMonitoring));
410 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseSoftwareMonitoring"), _("Software monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseSoftwareMonitoring));
411 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseExternalMonitoring"), _("External monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseExternalMonitoring));
413 /* Configuration object options (i.e. not session specific) */
415 ActionManager::register_toggle_action (option_actions, X_("StopPluginsWithTransport"), _("Stop plugins with transport"), mem_fun (*this, &ARDOUR_UI::toggle_StopPluginsWithTransport));
416 ActionManager::register_toggle_action (option_actions, X_("VerifyRemoveLastCapture"), _("Verify remove last capture"), mem_fun (*this, &ARDOUR_UI::toggle_VerifyRemoveLastCapture));
417 ActionManager::register_toggle_action (option_actions, X_("StopRecordingOnXrun"), _("Stop recording on xrun"), mem_fun (*this, &ARDOUR_UI::toggle_StopRecordingOnXrun));
418 ActionManager::register_toggle_action (option_actions, X_("StopTransportAtEndOfSession"), _("Stop transport at session end"), mem_fun (*this, &ARDOUR_UI::toggle_StopTransportAtEndOfSession));
419 ActionManager::register_toggle_action (option_actions, X_("GainReduceFastTransport"), _("-12dB gain reduce ffwd/rewind"), mem_fun (*this, &ARDOUR_UI::toggle_GainReduceFastTransport));
420 ActionManager::register_toggle_action (option_actions, X_("LatchedRecordEnable"), _("Rec-enable stays engaged at stop"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedRecordEnable));
422 /* session options */
424 act = ActionManager::register_toggle_action (option_actions, X_("DoNotRunPluginsWhileRecording"), _("Do not run plugins while recording"), mem_fun (*this, &ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording));
425 ActionManager::session_sensitive_actions.push_back (act);
427 act = ActionManager::register_toggle_action (option_actions, X_("LatchedSolo"), _("Latched solo"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedSolo));
428 ActionManager::session_sensitive_actions.push_back (act);
430 RadioAction::Group solo_group;
432 act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloInPlace"), _("Solo in-place"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
433 ActionManager::session_sensitive_actions.push_back (act);
434 act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloViaBus"), _("Solo via bus"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
435 ActionManager::session_sensitive_actions.push_back (act);
437 act = ActionManager::register_action (option_actions, X_("AutomaticallyCreateCrossfades"), _("Automatically create crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_AutomaticallyCreateCrossfades));
438 ActionManager::session_sensitive_actions.push_back (act);
439 act = ActionManager::register_action (option_actions, X_("UnmuteNewFullCrossfades"), _("Unmute new full crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_UnmuteNewFullCrossfades));
440 ActionManager::session_sensitive_actions.push_back (act);
442 ActionManager::add_action_group (shuttle_actions);
443 ActionManager::add_action_group (option_actions);
444 ActionManager::add_action_group (jack_actions);
445 ActionManager::add_action_group (transport_actions);
446 ActionManager::add_action_group (main_actions);
447 ActionManager::add_action_group (common_actions);
449 /* initialize state of non-session dependent options */
451 setup_config_options ();
455 ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
458 /* this happens when we build the menu bar when control protocol support
459 has been used in the past for some given protocol - the item needs
460 to be made active, but there is no session yet.
465 if (cpi->protocol == 0) {
466 ControlProtocolManager::instance().instantiate (*cpi);
468 ControlProtocolManager::instance().teardown (*cpi);
473 ARDOUR_UI::build_control_surface_menu ()
475 list<ControlProtocolInfo*>::iterator i;
477 /* !!! this has to match the top level entry from ardour.menus */
479 string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
481 for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
483 if (!(*i)->mandatory) {
485 string action_name = "Toggle";
486 action_name += legalize_for_path ((*i)->name);
487 action_name += "Surface";
489 string action_label = (*i)->name;
491 Glib::RefPtr<Action> act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), action_label.c_str(),
492 (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), *i)));
494 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
496 if ((*i)->protocol || (*i)->requested) {
500 ui += "<menuitem action='";
506 ui += "</menu>\n</menu>\n</menubar>\n";
508 ActionManager::ui_manager->add_ui_from_string (ui);
512 ARDOUR_UI::build_menu_bar ()
514 build_control_surface_menu ();
516 menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
517 menu_bar->set_name ("MainMenuBar");
520 * This is needed because this property does not get installed
521 * until the Menu GObject class is registered, which happens
522 * when the first menu instance is created.
524 Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;
526 wall_clock_box.add (wall_clock_label);
527 wall_clock_box.set_name ("WallClock");
528 wall_clock_label.set_name ("WallClock");
530 disk_space_box.add (disk_space_label);
531 disk_space_box.set_name ("WallClock");
532 disk_space_label.set_name ("WallClock");
534 cpu_load_box.add (cpu_load_label);
535 cpu_load_box.set_name ("CPULoad");
536 cpu_load_label.set_name ("CPULoad");
538 buffer_load_box.add (buffer_load_label);
539 buffer_load_box.set_name ("BufferLoad");
540 buffer_load_label.set_name ("BufferLoad");
542 sample_rate_box.add (sample_rate_label);
543 sample_rate_box.set_name ("SampleRate");
544 sample_rate_label.set_name ("SampleRate");
546 menu_hbox.pack_start (*menu_bar, true, true);
547 menu_hbox.pack_end (wall_clock_box, false, false, 10);
548 menu_hbox.pack_end (disk_space_box, false, false, 10);
549 menu_hbox.pack_end (cpu_load_box, false, false, 10);
550 menu_hbox.pack_end (buffer_load_box, false, false, 10);
551 menu_hbox.pack_end (sample_rate_box, false, false, 10);
553 menu_bar_base.set_name ("MainMenuBar");
554 menu_bar_base.add (menu_hbox);