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.
20 /* This file contains any ARDOUR_UI methods that require knowledge of
21 the editor, and exists so that no compilation dependency exists
22 between the main ARDOUR_UI modules and the PublicEditor class. This
23 is to cut down on the nasty compile times for both these classes.
26 #include <pbd/file_utils.h>
29 #include <glibmm/miscutils.h>
31 #include <gtkmm2ext/utils.h>
32 #include <gtkmm2ext/window_title.h>
34 #include "ardour_ui.h"
35 #include "public_editor.h"
36 #include "audio_clock.h"
37 #include "engine_dialog.h"
43 #include <gtkmm2ext/sync-menu.h>
46 #include <ardour/session.h>
47 #include <ardour/profile.h>
48 #include <ardour/audioengine.h>
49 #include <ardour/control_protocol_manager.h>
51 #include <control_protocol/control_protocol.h>
56 using namespace ARDOUR;
58 using namespace Gtkmm2ext;
64 ARDOUR_UI::create_editor ()
68 editor = new Editor ();
71 catch (failed_constructor& err) {
75 editor->Realized.connect (mem_fun (*this, &ARDOUR_UI::editor_realized));
81 ARDOUR_UI::install_actions ()
83 Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
84 Glib::RefPtr<Action> act;
86 /* menus + submenus that need action items */
88 ActionManager::register_action (main_actions, X_("Session"), _("Session"));
89 ActionManager::register_action (main_actions, X_("Files"), _("Import/Export"));
90 ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
91 ActionManager::register_action (main_actions, X_("Sync"), _("Sync"));
92 ActionManager::register_action (main_actions, X_("Options"), _("Options"));
93 ActionManager::register_action (main_actions, X_("TransportOptions"), _("Options"));
94 ActionManager::register_action (main_actions, X_("Help"), _("Help"));
95 ActionManager::register_action (main_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
96 ActionManager::register_action (main_actions, X_("AudioFileFormat"), _("Audio File Format"));
97 ActionManager::register_action (main_actions, X_("AudioFileFormatHeader"), _("File Type"));
98 ActionManager::register_action (main_actions, X_("AudioFileFormatData"), _("Sample Format"));
99 ActionManager::register_action (main_actions, X_("ControlSurfaces"), _("Control Surfaces"));
100 ActionManager::register_action (main_actions, X_("Plugins"), _("Plugins"));
101 ActionManager::register_action (main_actions, X_("Metering"), _("Metering"));
102 ActionManager::register_action (main_actions, X_("MeteringFallOffRate"), _("Fall off rate"));
103 ActionManager::register_action (main_actions, X_("MeteringHoldTime"), _("Hold Time"));
104 ActionManager::register_action (main_actions, X_("Denormals"), _("Denormal Handling"));
106 /* the real actions */
108 act = ActionManager::register_action (main_actions, X_("New"), _("New"), hide_return (bind (mem_fun(*this, &ARDOUR_UI::get_session_parameters), true, true)));
110 ActionManager::register_action (main_actions, X_("Open"), _("Open"), mem_fun(*this, &ARDOUR_UI::open_session));
111 ActionManager::register_action (main_actions, X_("Recent"), _("Recent"), mem_fun(*this, &ARDOUR_UI::open_recent_session));
112 act = ActionManager::register_action (main_actions, X_("Close"), _("Close"), mem_fun(*this, &ARDOUR_UI::close_session));
113 ActionManager::session_sensitive_actions.push_back (act);
115 act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus"),
116 bind (mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0));
117 ActionManager::session_sensitive_actions.push_back (act);
122 sys::path anicomp_file_path;
124 if (PBD::find_file_in_search_path (Glib::getenv("PATH"), "AniComp", anicomp_file_path)) {
125 act = ActionManager::register_action (main_actions, X_("aniConnect"), _("Connect"), (mem_fun (*editor, &PublicEditor::connect_to_image_compositor)));
126 ActionManager::session_sensitive_actions.push_back (act);
131 act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot"), mem_fun(*this, &ARDOUR_UI::snapshot_session));
132 ActionManager::session_sensitive_actions.push_back (act);
134 act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."), mem_fun(*this, &ARDOUR_UI::save_template));
135 ActionManager::session_sensitive_actions.push_back (act);
137 act = ActionManager::register_action (main_actions, X_("ExportSession"), _("Export session to audiofile..."), mem_fun (*editor, &PublicEditor::export_session));
138 ActionManager::session_sensitive_actions.push_back (act);
140 act = ActionManager::register_action (main_actions, X_("ExportSelection"), _("Export selection to audiofile..."), mem_fun (*editor, &PublicEditor::export_selection));
141 ActionManager::session_sensitive_actions.push_back (act);
142 ActionManager::time_selection_sensitive_actions.push_back (act);
144 act = ActionManager::register_action (main_actions, X_("ExportRangeMarkers"), _("Export range markers to audiofile..."), mem_fun (*editor, &PublicEditor::export_range_markers));
145 ActionManager::session_sensitive_actions.push_back (act);
146 ActionManager::range_sensitive_actions.push_back (act);
148 act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
149 ActionManager::session_sensitive_actions.push_back (act);
151 act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Cleanup unused sources"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
152 ActionManager::session_sensitive_actions.push_back (act);
153 act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush wastebasket"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
154 ActionManager::session_sensitive_actions.push_back (act);
156 /* JACK actions for controlling ... JACK */
158 Glib::RefPtr<ActionGroup> jack_actions = ActionGroup::create (X_("JACK"));
159 ActionManager::register_action (jack_actions, X_("JACK"), _("JACK"));
160 ActionManager::register_action (jack_actions, X_("Latency"), _("Latency"));
162 act = ActionManager::register_action (jack_actions, X_("JACKReconnect"), _("Reconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::reconnect_to_jack));
163 ActionManager::jack_opposite_sensitive_actions.push_back (act);
165 act = ActionManager::register_action (jack_actions, X_("JACKDisconnect"), _("Disconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::disconnect_from_jack));
166 ActionManager::jack_sensitive_actions.push_back (act);
168 RadioAction::Group jack_latency_group;
170 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency32"), X_("32"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 32));
171 ActionManager::jack_sensitive_actions.push_back (act);
172 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency64"), X_("64"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 64));
173 ActionManager::jack_sensitive_actions.push_back (act);
174 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency128"), X_("128"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 128));
175 ActionManager::jack_sensitive_actions.push_back (act);
176 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency256"), X_("256"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 256));
177 ActionManager::jack_sensitive_actions.push_back (act);
178 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency512"), X_("512"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 512));
179 ActionManager::jack_sensitive_actions.push_back (act);
180 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency1024"), X_("1024"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 1024));
181 ActionManager::jack_sensitive_actions.push_back (act);
182 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency2048"), X_("2048"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 2048));
183 ActionManager::jack_sensitive_actions.push_back (act);
184 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency4096"), X_("4096"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 4096));
185 ActionManager::jack_sensitive_actions.push_back (act);
186 act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency8192"), X_("8192"), bind (mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 8192));
187 ActionManager::jack_sensitive_actions.push_back (act);
189 /* these actions are intended to be shared across all windows */
191 common_actions = ActionGroup::create (X_("Common"));
192 ActionManager::register_action (main_actions, X_("WindowMenu"), _("Window"));
193 ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (mem_fun(*this, &ARDOUR_UI::finish)));
195 /* windows visibility actions */
197 ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
199 ActionManager::register_action (common_actions, X_("goto-editor"), _("Show Editor"), mem_fun(*this, &ARDOUR_UI::goto_editor_window));
200 ActionManager::register_action (common_actions, X_("goto-mixer"), _("Show Mixer"), mem_fun(*this, &ARDOUR_UI::goto_mixer_window));
201 ActionManager::register_toggle_action (common_actions, X_("ToggleOptionsEditor"), _("Preferences"), mem_fun(*this, &ARDOUR_UI::toggle_options_window));
202 act = ActionManager::register_toggle_action (common_actions, X_("ToggleInspector"), _("Track/Bus Inspector"), mem_fun(*this, &ARDOUR_UI::toggle_route_params_window));
203 ActionManager::session_sensitive_actions.push_back (act);
204 act = ActionManager::register_toggle_action (common_actions, X_("ToggleConnections"), _("Connections"), mem_fun(*this, &ARDOUR_UI::toggle_connection_editor));
205 ActionManager::session_sensitive_actions.push_back (act);
206 act = ActionManager::register_toggle_action (common_actions, X_("ToggleLocations"), _("Locations"), mem_fun(*this, &ARDOUR_UI::toggle_location_window));
207 ActionManager::session_sensitive_actions.push_back (act);
208 act = ActionManager::register_toggle_action (common_actions, X_("ToggleBigClock"), _("Big Clock"), mem_fun(*this, &ARDOUR_UI::toggle_big_clock_window));
209 ActionManager::session_sensitive_actions.push_back (act);
210 ActionManager::register_action (common_actions, X_("About"), _("About"), mem_fun(*this, &ARDOUR_UI::show_about));
211 ActionManager::register_toggle_action (common_actions, X_("ToggleThemeManager"), _("Theme Manager"), mem_fun(*this, &ARDOUR_UI::toggle_theme_manager));
212 ActionManager::register_toggle_action (common_actions, X_("ToggleKeyEditor"), _("Keybindings"), mem_fun(*this, &ARDOUR_UI::toggle_key_editor));
213 ActionManager::register_toggle_action (common_actions, X_("ToggleBundleManager"), _("Bundle Manager"), mem_fun(*this, &ARDOUR_UI::toggle_bundle_manager));
215 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, 1));
216 ActionManager::session_sensitive_actions.push_back (act);
217 act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, 1));
218 ActionManager::session_sensitive_actions.push_back (act);
219 act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_midi_track), 1));
220 ActionManager::session_sensitive_actions.push_back (act);
221 //act = ActionManager::register_action (common_actions, X_("AddMidiBus"), _("Add Midi Bus"), mem_fun(*this, &ARDOUR_UI::session_add_midi_bus));
222 //ActionManager::session_sensitive_actions.push_back (act);
223 act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
224 ActionManager::session_sensitive_actions.push_back (act);
225 act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), mem_fun(*this, &ARDOUR_UI::remove_last_capture));
226 ActionManager::session_sensitive_actions.push_back (act);
228 Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
230 /* do-nothing action for the "transport" menu bar item */
232 ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
234 /* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
235 menus and via button proxies.
238 act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), mem_fun(*this, &ARDOUR_UI::transport_stop));
239 ActionManager::session_sensitive_actions.push_back (act);
240 ActionManager::transport_sensitive_actions.push_back (act);
241 act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), mem_fun(*this, &ARDOUR_UI::transport_roll));
242 ActionManager::session_sensitive_actions.push_back (act);
243 ActionManager::transport_sensitive_actions.push_back (act);
245 ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false));
246 ActionManager::session_sensitive_actions.push_back (act);
247 ActionManager::transport_sensitive_actions.push_back (act);
248 ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true));
249 ActionManager::session_sensitive_actions.push_back (act);
250 ActionManager::transport_sensitive_actions.push_back (act);
252 /* these two behave as follows:
254 - if transport speed != 1.0 or != -1.0, change speed to 1.0 or -1.0 (respectively)
255 - otherwise do nothing
258 ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition To Roll"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
259 ActionManager::session_sensitive_actions.push_back (act);
260 ActionManager::session_sensitive_actions.push_back (act);
262 ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition To Reverse"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
263 ActionManager::session_sensitive_actions.push_back (act);
264 ActionManager::session_sensitive_actions.push_back (act);
267 act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
268 ActionManager::session_sensitive_actions.push_back (act);
269 ActionManager::transport_sensitive_actions.push_back (act);
270 act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), mem_fun(*this, &ARDOUR_UI::transport_play_selection));
271 ActionManager::session_sensitive_actions.push_back (act);
272 ActionManager::transport_sensitive_actions.push_back (act);
274 act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), bind (mem_fun(*this, &ARDOUR_UI::transport_record), false));
275 ActionManager::session_sensitive_actions.push_back (act);
276 act = ActionManager::register_action (transport_actions, X_("record-roll"), _("Start Recording"), bind (mem_fun(*this, &ARDOUR_UI::transport_record), true));
277 ActionManager::session_sensitive_actions.push_back (act);
278 ActionManager::transport_sensitive_actions.push_back (act);
279 act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
280 ActionManager::session_sensitive_actions.push_back (act);
281 ActionManager::transport_sensitive_actions.push_back (act);
282 act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
283 ActionManager::session_sensitive_actions.push_back (act);
284 ActionManager::transport_sensitive_actions.push_back (act);
285 act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
286 ActionManager::session_sensitive_actions.push_back (act);
287 ActionManager::transport_sensitive_actions.push_back (act);
288 act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
289 ActionManager::session_sensitive_actions.push_back (act);
290 ActionManager::transport_sensitive_actions.push_back (act);
291 act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
292 ActionManager::session_sensitive_actions.push_back (act);
293 ActionManager::transport_sensitive_actions.push_back (act);
294 act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
295 ActionManager::session_sensitive_actions.push_back (act);
296 ActionManager::transport_sensitive_actions.push_back (act);
297 act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Goto Zero"), mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
298 ActionManager::session_sensitive_actions.push_back (act);
299 ActionManager::transport_sensitive_actions.push_back (act);
300 act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Goto Start"), mem_fun(*this, &ARDOUR_UI::transport_goto_start));
301 ActionManager::session_sensitive_actions.push_back (act);
302 ActionManager::transport_sensitive_actions.push_back (act);
303 act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Goto End"), mem_fun(*this, &ARDOUR_UI::transport_goto_end));
304 ActionManager::session_sensitive_actions.push_back (act);
305 ActionManager::transport_sensitive_actions.push_back (act);
307 act = ActionManager::register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), mem_fun(primary_clock, &AudioClock::focus));
308 ActionManager::session_sensitive_actions.push_back (act);
309 ActionManager::transport_sensitive_actions.push_back (act);
311 act = ActionManager::register_action (transport_actions, X_("primary-clock-bbt"), _("Bars & Beats"), bind (mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::BBT));
312 ActionManager::session_sensitive_actions.push_back (act);
313 act = ActionManager::register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), bind (mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec));
314 ActionManager::session_sensitive_actions.push_back (act);
315 act = ActionManager::register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), bind (mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Frames));
316 ActionManager::session_sensitive_actions.push_back (act);
317 act = ActionManager::register_action (transport_actions, X_("primary-clock-off"), _("Off"), bind (mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Off));
318 ActionManager::session_sensitive_actions.push_back (act);
320 act = ActionManager::register_action (transport_actions, X_("secondary-clock-bbt"), _("Bars & Beats"), bind (mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::BBT));
321 ActionManager::session_sensitive_actions.push_back (act);
322 act = ActionManager::register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), bind (mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec));
323 ActionManager::session_sensitive_actions.push_back (act);
324 act = ActionManager::register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), bind (mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames));
325 ActionManager::session_sensitive_actions.push_back (act);
326 act = ActionManager::register_action (transport_actions, X_("secondary-clock-off"), _("Off"), bind (mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Off));
327 ActionManager::session_sensitive_actions.push_back (act);
329 act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
330 ActionManager::session_sensitive_actions.push_back (act);
331 ActionManager::transport_sensitive_actions.push_back (act);
332 act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch Out"), mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
333 ActionManager::session_sensitive_actions.push_back (act);
334 ActionManager::transport_sensitive_actions.push_back (act);
335 act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunch"), _("Punch In/Out"), mem_fun(*this, &ARDOUR_UI::toggle_punch));
336 ActionManager::session_sensitive_actions.push_back (act);
337 ActionManager::transport_sensitive_actions.push_back (act);
338 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), mem_fun(*this, &ARDOUR_UI::toggle_click));
339 ActionManager::session_sensitive_actions.push_back (act);
340 ActionManager::transport_sensitive_actions.push_back (act);
341 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto Input"), mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
342 ActionManager::session_sensitive_actions.push_back (act);
343 ActionManager::transport_sensitive_actions.push_back (act);
344 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto Play"), mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
345 ActionManager::session_sensitive_actions.push_back (act);
346 ActionManager::transport_sensitive_actions.push_back (act);
347 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
348 ActionManager::session_sensitive_actions.push_back (act);
349 ActionManager::transport_sensitive_actions.push_back (act);
351 ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync startup to video"), mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
352 act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time master"), mem_fun(*this, &ARDOUR_UI::toggle_time_master));
353 ActionManager::session_sensitive_actions.push_back (act);
355 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 0U));
356 ActionManager::session_sensitive_actions.push_back (act);
357 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 1U));
358 ActionManager::session_sensitive_actions.push_back (act);
359 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 2U));
360 ActionManager::session_sensitive_actions.push_back (act);
361 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 3U));
362 ActionManager::session_sensitive_actions.push_back (act);
363 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 4U));
364 ActionManager::session_sensitive_actions.push_back (act);
365 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 5U));
366 ActionManager::session_sensitive_actions.push_back (act);
367 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 6U));
368 ActionManager::session_sensitive_actions.push_back (act);
369 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 7U));
370 ActionManager::session_sensitive_actions.push_back (act);
371 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 8U));
372 ActionManager::session_sensitive_actions.push_back (act);
373 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U));
374 ActionManager::session_sensitive_actions.push_back (act);
375 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U));
376 ActionManager::session_sensitive_actions.push_back (act);
377 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U));
378 ActionManager::session_sensitive_actions.push_back (act);
379 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U));
380 ActionManager::session_sensitive_actions.push_back (act);
381 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U));
382 ActionManager::session_sensitive_actions.push_back (act);
383 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U));
384 ActionManager::session_sensitive_actions.push_back (act);
385 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U));
386 ActionManager::session_sensitive_actions.push_back (act);
387 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U));
388 ActionManager::session_sensitive_actions.push_back (act);
389 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U));
390 ActionManager::session_sensitive_actions.push_back (act);
391 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U));
392 ActionManager::session_sensitive_actions.push_back (act);
393 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U));
394 ActionManager::session_sensitive_actions.push_back (act);
395 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U));
396 ActionManager::session_sensitive_actions.push_back (act);
397 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U));
398 ActionManager::session_sensitive_actions.push_back (act);
399 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U));
400 ActionManager::session_sensitive_actions.push_back (act);
401 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U));
402 ActionManager::session_sensitive_actions.push_back (act);
403 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U));
404 ActionManager::session_sensitive_actions.push_back (act);
405 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U));
406 ActionManager::session_sensitive_actions.push_back (act);
407 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U));
408 ActionManager::session_sensitive_actions.push_back (act);
409 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U));
410 ActionManager::session_sensitive_actions.push_back (act);
411 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U));
412 ActionManager::session_sensitive_actions.push_back (act);
413 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U));
414 ActionManager::session_sensitive_actions.push_back (act);
415 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U));
416 ActionManager::session_sensitive_actions.push_back (act);
417 act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U));
418 ActionManager::session_sensitive_actions.push_back (act);
420 Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
422 shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), hide_return (bind (mem_fun (*Config, &Configuration::set_shuttle_units), Percentage)));
423 shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), hide_return (bind (mem_fun (*Config, &Configuration::set_shuttle_units), Semitones)));
425 Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
427 act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
428 ActionManager::session_sensitive_actions.push_back (act);
429 act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
430 ActionManager::session_sensitive_actions.push_back (act);
431 act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
432 ActionManager::session_sensitive_actions.push_back (act);
433 act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
434 ActionManager::session_sensitive_actions.push_back (act);
436 act = ActionManager::register_toggle_action (option_actions, X_("UseOSC"), _("Use OSC"), mem_fun (*this, &ARDOUR_UI::toggle_use_osc));
438 act->set_sensitive (false);
440 act = ActionManager::register_toggle_action (option_actions, X_("ToggleTapeMachineMode"), _("Tape Machine mode"), mem_fun (*this, &ARDOUR_UI::toggle_TapeMachineMode));
441 ActionManager::session_sensitive_actions.push_back (act);
443 ActionManager::register_toggle_action (option_actions, X_("SyncEditorAndMixerTrackOrder"), _("Sync Editor and Mixer track order"), mem_fun (*this, &ARDOUR_UI::toggle_sync_order_keys));
444 ActionManager::register_toggle_action (option_actions, X_("StopPluginsWithTransport"), _("Stop plugins with transport"), mem_fun (*this, &ARDOUR_UI::toggle_StopPluginsWithTransport));
445 ActionManager::register_toggle_action (option_actions, X_("VerifyRemoveLastCapture"), _("Verify remove last capture"), mem_fun (*this, &ARDOUR_UI::toggle_VerifyRemoveLastCapture));
446 ActionManager::register_toggle_action (option_actions, X_("PeriodicSafetyBackups"), _("Make periodic safety backups"), mem_fun (*this, &ARDOUR_UI::toggle_PeriodicSafetyBackups));
447 ActionManager::register_toggle_action (option_actions, X_("StopRecordingOnXrun"), _("Stop recording on xrun"), mem_fun (*this, &ARDOUR_UI::toggle_StopRecordingOnXrun));
448 ActionManager::register_toggle_action (option_actions, X_("CreateXrunMarker"), _("Create marker at xrun location"), mem_fun (*this, &ARDOUR_UI::toggle_CreateXrunMarker));
449 ActionManager::register_toggle_action (option_actions, X_("StopTransportAtEndOfSession"), _("Stop transport at session end"), mem_fun (*this, &ARDOUR_UI::toggle_StopTransportAtEndOfSession));
450 ActionManager::register_toggle_action (option_actions, X_("GainReduceFastTransport"), _("-12dB gain reduce ffwd/rewind"), mem_fun (*this, &ARDOUR_UI::toggle_GainReduceFastTransport));
451 ActionManager::register_toggle_action (option_actions, X_("LatchedRecordEnable"), _("Rec-enable stays engaged at stop"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedRecordEnable));
452 ActionManager::register_toggle_action (option_actions, X_("RegionEquivalentsOverlap"), _("Region equivalents overlap"), mem_fun (*this, &ARDOUR_UI::toggle_RegionEquivalentsOverlap));
453 ActionManager::register_toggle_action (option_actions, X_("PrimaryClockDeltaEditCursor"), _("Primary Clock delta to edit point"), mem_fun (*this, &ARDOUR_UI::toggle_PrimaryClockDeltaEditCursor));
454 ActionManager::register_toggle_action (option_actions, X_("SecondaryClockDeltaEditCursor"), _("Secondary Clock delta to edit point"), mem_fun (*this, &ARDOUR_UI::toggle_SecondaryClockDeltaEditCursor));
455 ActionManager::register_toggle_action (option_actions, X_("ShowTrackMeters"), _("Enable Editor Meters"), mem_fun (*this, &ARDOUR_UI::toggle_ShowTrackMeters));
456 ActionManager::register_toggle_action (option_actions, X_("OnlyCopyImportedFiles"), _("Always copy imported files"), mem_fun (*this, &ARDOUR_UI::toggle_only_copy_imported_files));
457 ActionManager::register_toggle_action (option_actions, X_("RubberbandingSnapsToGrid"), _("Rubberbanding Snaps to Grid"), mem_fun (*this, &ARDOUR_UI::toggle_rubberbanding_snaps_to_grid));
458 ActionManager::register_toggle_action (option_actions, X_("AutoAnalyseAudio"), _("Auto-analyse new audio"), mem_fun (*this, &ARDOUR_UI::toggle_auto_analyse_audio));
460 ActionManager::register_toggle_action (option_actions, X_("DefaultNarrowMS"), _("Use narrow mixer strips"), mem_fun (*this, &ARDOUR_UI::toggle_use_narrow_ms));
462 RadioAction::Group denormal_group;
464 ActionManager::register_toggle_action (option_actions, X_("DenormalProtection"), _("Use DC bias"), mem_fun (*this, &ARDOUR_UI::toggle_denormal_protection));
465 ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalNone"), _("No processor handling"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalNone));
467 // as of September 10th 2007, Valgrind cannot handle various FPU flag setting instructions
470 if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
472 /* we still need these actions to exist, but make them all insensitive */
474 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalFTZ"), _("Use FlushToZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalFTZ));
475 act->set_sensitive (false);
476 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalDAZ"), _("Use DenormalsAreZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalDAZ));
477 act->set_sensitive (false);
478 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalFTZDAZ"), _("Use FlushToZero & DenormalsAreZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalFTZDAZ));
479 act->set_sensitive (false);
485 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalFTZ"), _("Use FlushToZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalFTZ));
486 if (!fpu.has_flush_to_zero()) {
487 act->set_sensitive (false);
490 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalDAZ"), _("Use DenormalsAreZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalDAZ));
491 if (!fpu.has_denormals_are_zero()) {
492 act->set_sensitive (false);
495 act = ActionManager::register_radio_action (option_actions, denormal_group, X_("DenormalFTZDAZ"), _("Use FlushToZero & DenormalsAreZero"), bind (mem_fun (*this, &ARDOUR_UI::set_denormal_model), DenormalFTZDAZ));
496 if (!fpu.has_flush_to_zero() || !fpu.has_denormals_are_zero()) {
497 act->set_sensitive (false);
501 act = ActionManager::register_toggle_action (option_actions, X_("DoNotRunPluginsWhileRecording"), _("Do not run plugins while recording"), mem_fun (*this, &ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording));
502 ActionManager::session_sensitive_actions.push_back (act);
504 act = ActionManager::register_toggle_action (option_actions, X_("LatchedSolo"), _("Latched solo"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedSolo));
505 ActionManager::session_sensitive_actions.push_back (act);
506 act = ActionManager::register_toggle_action (option_actions, X_("ShowSoloMutes"), _("Show solo muting"), mem_fun (*this, &ARDOUR_UI::toggle_ShowSoloMutes));
507 ActionManager::session_sensitive_actions.push_back (act);
509 /* act = ActionManager::register_action (option_actions, X_("DisableAllPlugins"), _("Disable All Plugins"), mem_fun (*this, &ARDOUR_UI::disable_all_plugins));
510 ActionManager::session_sensitive_actions.push_back (act);
511 act = ActionManager::register_action (option_actions, X_("ABAllPlugins"), _("A/B All Plugins"), mem_fun (*this, &ARDOUR_UI::ab_all_plugins));
512 ActionManager::session_sensitive_actions.push_back (act); */
514 /* !!! REMEMBER THAT RADIO ACTIONS HAVE TO BE HANDLED WITH MORE FINESSE THAN SIMPLE TOGGLES !!! */
516 RadioAction::Group meter_falloff_group;
517 RadioAction::Group meter_hold_group;
519 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffOff"), _("Off"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffOff));
520 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffSlowest"), _("Slowest"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffSlowest));
521 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffSlow"), _("Slow"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffSlow));
522 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffMedium"), _("Medium"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffMedium));
523 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffFast"), _("Fast"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffFast));
524 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffFaster"), _("Faster"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffFaster));
525 ActionManager::register_radio_action (option_actions, meter_falloff_group, X_("MeterFalloffFastest"), _("Fastest"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_falloff), MeterFalloffFastest));
527 ActionManager::register_radio_action (option_actions, meter_hold_group, X_("MeterHoldOff"), _("Off"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_hold), MeterHoldOff));
528 ActionManager::register_radio_action (option_actions, meter_hold_group, X_("MeterHoldShort"), _("Short"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_hold), MeterHoldShort));
529 ActionManager::register_radio_action (option_actions, meter_hold_group, X_("MeterHoldMedium"), _("Medium"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_hold), MeterHoldMedium));
530 ActionManager::register_radio_action (option_actions, meter_hold_group, X_("MeterHoldLong"), _("Long"), bind (mem_fun (*this, &ARDOUR_UI::set_meter_hold), MeterHoldLong));
532 RadioAction::Group file_header_group;
534 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));
535 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));
536 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));
537 // 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));
538 // 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));
539 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));
541 RadioAction::Group file_data_group;
544 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));
545 act = ActionManager::register_radio_action (option_actions, file_data_group, X_("FileDataFormat24bit"), X_("24-bit integer"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_data_format), ARDOUR::FormatInt24));
546 act = ActionManager::register_radio_action (option_actions, file_data_group, X_("FileDataFormat16bit"), X_("16-bit integer"), bind (mem_fun (*this, &ARDOUR_UI::set_native_file_data_format), ARDOUR::FormatInt16));
548 RadioAction::Group monitoring_group;
550 /* it would be nice not to even show this item, but that messes up the
551 menus which are not dynamically modified at runtime. so we make it
552 sensitive only if it makes sense.
555 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseHardwareMonitoring"), _("JACK does monitoring"), bind (mem_fun (*this, &ARDOUR_UI::set_monitor_model), HardwareMonitoring));
556 if (engine->can_request_hardware_monitoring()) {
557 act->set_sensitive (false);
559 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseSoftwareMonitoring"), _("Ardour does monitoring"), bind (mem_fun (*this, &ARDOUR_UI::set_monitor_model), SoftwareMonitoring));
560 act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseExternalMonitoring"), _("Audio Hardware does monitoring"), bind (mem_fun (*this, &ARDOUR_UI::set_monitor_model), ExternalMonitoring));
562 RadioAction::Group solo_group;
564 act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloInPlace"), _("Solo in-place"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_solo_model), InverseMute)));
565 ActionManager::session_sensitive_actions.push_back (act);
566 act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloViaBus"), _("Solo via bus"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_solo_model), SoloBus)));
567 ActionManager::session_sensitive_actions.push_back (act);
569 RadioAction::Group input_auto_connect_group;
571 act = ActionManager::register_radio_action (option_actions, input_auto_connect_group, X_("InputAutoConnectPhysical"), _("Auto-connect inputs to physical inputs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_input_auto_connect), AutoConnectPhysical)));
572 ActionManager::session_sensitive_actions.push_back (act);
573 act = ActionManager::register_radio_action (option_actions, input_auto_connect_group, X_("InputAutoConnectManual"), _("Manually connect inputs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_input_auto_connect), (AutoConnectOption) 0)));
574 ActionManager::session_sensitive_actions.push_back (act);
576 RadioAction::Group output_auto_connect_group;
578 act = ActionManager::register_radio_action (option_actions, output_auto_connect_group, X_("OutputAutoConnectPhysical"), _("Auto-connect outputs to physical outs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_output_auto_connect), AutoConnectPhysical)));
579 ActionManager::session_sensitive_actions.push_back (act);
580 act = ActionManager::register_radio_action (option_actions, output_auto_connect_group, X_("OutputAutoConnectMaster"), _("Auto-connect outputs to master bus"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_output_auto_connect), AutoConnectMaster)));
581 ActionManager::session_sensitive_actions.push_back (act);
582 act = ActionManager::register_radio_action (option_actions, output_auto_connect_group, X_("OutputAutoConnectManual"), _("Manually connect outputs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_output_auto_connect), (AutoConnectOption) 0)));
583 ActionManager::session_sensitive_actions.push_back (act);
585 RadioAction::Group remote_group;
587 act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteUserDefined"), _("Remote ID assigned by User"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), UserOrdered)));
588 ActionManager::session_sensitive_actions.push_back (act);
589 act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteMixerDefined"), _("Remote ID follows order of Mixer"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), MixerOrdered)));
590 ActionManager::session_sensitive_actions.push_back (act);
591 act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteEditorDefined"), _("Remote ID follows order of Editor"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), EditorOrdered)));
592 ActionManager::session_sensitive_actions.push_back (act);
594 act = ActionManager::register_toggle_action (option_actions, X_("AutoRebinding"), _("Auto Rebind Controls"), mem_fun (*(this->mixer), &Mixer_UI::toggle_auto_rebinding));
595 ActionManager::session_sensitive_actions.push_back (act);
598 ActionManager::add_action_group (shuttle_actions);
599 ActionManager::add_action_group (option_actions);
600 ActionManager::add_action_group (jack_actions);
601 ActionManager::add_action_group (transport_actions);
602 ActionManager::add_action_group (main_actions);
603 ActionManager::add_action_group (common_actions);
607 ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
610 /* this happens when we build the menu bar when control protocol support
611 has been used in the past for some given protocol - the item needs
612 to be made active, but there is no session yet.
617 if (cpi->protocol == 0) {
618 ControlProtocolManager::instance().instantiate (*cpi);
620 ControlProtocolManager::instance().teardown (*cpi);
625 ARDOUR_UI::toggle_control_protocol_feedback (ControlProtocolInfo* cpi, const char* group, string action)
628 /* this happens when we build the menu bar when control protocol support
629 has been used in the past for some given protocol - the item needs
630 to be made active, but there is no session yet.
636 Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (group, action.c_str());
639 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
642 bool x = tact->get_active();
644 if (x != cpi->protocol->get_feedback()) {
645 cpi->protocol->set_feedback (x);
653 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
655 Glib::RefPtr<Action> action;
656 const char* action_name = 0;
660 action_name = X_("JACKLatency32");
663 action_name = X_("JACKLatency64");
666 action_name = X_("JACKLatency128");
669 action_name = X_("JACKLatency512");
672 action_name = X_("JACKLatency1024");
675 action_name = X_("JACKLatency2048");
678 action_name = X_("JACKLatency4096");
681 action_name = X_("JACKLatency8192");
684 /* XXX can we do anything useful ? */
690 action = ActionManager::get_action (X_("JACK"), action_name);
693 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic (action);
695 if (ract && ract->get_active()) {
696 engine->request_buffer_size (nframes);
697 update_sample_rate (0);
704 ARDOUR_UI::build_control_surface_menu ()
706 list<ControlProtocolInfo*>::iterator i;
709 /* !!! this has to match the top level entry from ardour.menus */
711 string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
713 for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
715 if (!(*i)->mandatory) {
717 string action_name = "Toggle";
718 action_name += legalize_for_path ((*i)->name);
719 action_name += "Surface";
721 string action_label = (*i)->name;
723 Glib::RefPtr<Action> act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), action_label.c_str(),
724 (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), *i)));
726 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
728 with_feedback = false;
730 if ((*i)->protocol || (*i)->requested) {
734 ui += "<menuitem action='";
738 if ((*i)->supports_feedback) {
740 string submenu_name = action_name;
742 submenu_name += "SubMenu";
744 ActionManager::register_action (editor->editor_actions, submenu_name.c_str(), _("Controls"));
746 action_name += "Feedback";
748 Glib::RefPtr<Action> act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), _("Feedback"),
749 (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol_feedback),
754 ui += "<menu action='";
756 ui += "'>\n<menuitem action='";
758 ui += "'/>\n</menu>\n";
760 if ((*i)->protocol) {
761 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
762 tact->set_active ((*i)->protocol->get_feedback ());
768 ui += "</menu>\n</menu>\n</menubar>\n";
770 ActionManager::ui_manager->add_ui_from_string (ui);
774 ARDOUR_UI::build_menu_bar ()
776 if (!Profile->get_sae()) {
777 build_control_surface_menu ();
780 menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
781 menu_bar->set_name ("MainMenuBar");
784 * This is needed because this property does not get installed
785 * until the Menu GObject class is registered, which happens
786 * when the first menu instance is created.
788 // XXX bug in gtkmm causes this to popup an error message
789 // Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;
790 // so use this instead ...
791 gtk_settings_set_long_property (gtk_settings_get_default(), "gtk-can-change-accels", 1, "Ardour:designers");
793 wall_clock_box.add (wall_clock_label);
794 wall_clock_box.set_name ("WallClock");
795 wall_clock_label.set_name ("WallClock");
797 disk_space_box.add (disk_space_label);
798 disk_space_box.set_name ("WallClock");
799 disk_space_label.set_name ("WallClock");
801 cpu_load_box.add (cpu_load_label);
802 cpu_load_box.set_name ("CPULoad");
803 cpu_load_label.set_name ("CPULoad");
805 buffer_load_box.add (buffer_load_label);
806 buffer_load_box.set_name ("BufferLoad");
807 buffer_load_label.set_name ("BufferLoad");
809 sample_rate_box.add (sample_rate_label);
810 sample_rate_box.set_name ("SampleRate");
811 sample_rate_label.set_name ("SampleRate");
814 menu_hbox.pack_start (*menu_bar, true, true);
816 use_menubar_as_top_menubar ();
819 if (!Profile->get_small_screen()) {
821 // OSX provides its own wallclock, thank you very much
822 menu_hbox.pack_end (wall_clock_box, false, false, 2);
824 menu_hbox.pack_end (disk_space_box, false, false, 4);
827 menu_hbox.pack_end (cpu_load_box, false, false, 4);
828 menu_hbox.pack_end (buffer_load_box, false, false, 4);
829 menu_hbox.pack_end (sample_rate_box, false, false, 4);
831 menu_bar_base.set_name ("MainMenuBar");
832 menu_bar_base.add (menu_hbox);
836 ARDOUR_UI::use_menubar_as_top_menubar ()
839 ige_mac_menu_set_menu_bar ((GtkMenuShell*) menu_bar->gobj());
840 // ige_mac_menu_set_quit_menu_item (some_item->gobj());
846 ARDOUR_UI::setup_clock ()
848 ARDOUR_UI::Clock.connect (bind (mem_fun (big_clock, &AudioClock::set), false));
850 big_clock_window = new Window (WINDOW_TOPLEVEL);
852 big_clock_window->set_keep_above (true);
853 big_clock_window->set_border_width (0);
854 big_clock_window->add (big_clock);
856 WindowTitle title(Glib::get_application_name());
858 big_clock_window->set_title (title.get_string());
859 big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_MENU);
860 big_clock_window->signal_realize().connect (bind (sigc::ptr_fun (set_decoration), big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
861 big_clock_window->signal_unmap().connect (bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBigClock")));
863 manage_window (*big_clock_window);