Large nasty commit in the form of a 5000 line patch chock-full of completely
[ardour.git] / gtk2_ardour / ardour_ui_ed.cc
1 /*
2     Copyright (C) 20002-2004 Paul Davis 
3
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.
8
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.
13
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.
17
18     $Id$
19 */
20
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.
25 */
26
27 #include <pbd/pathscanner.h>
28
29 #include "ardour_ui.h"
30 #include "public_editor.h"
31 #include "audio_clock.h"
32 #include "editor.h"
33 #include "actions.h"
34
35 #include <ardour/session.h>
36 #include <ardour/control_protocol_manager.h>
37
38 #include <control_protocol/control_protocol.h>
39
40 #include "i18n.h"
41
42 using namespace ARDOUR;
43 using namespace PBD;
44 using namespace Gtk;
45 using namespace Gtkmm2ext;
46
47 int
48 ARDOUR_UI::create_editor ()
49
50 {
51         try {
52                 editor = new Editor (*engine);
53         }
54
55         catch (failed_constructor& err) {
56                 return -1;
57         }
58
59         editor->Realized.connect (mem_fun (*this, &ARDOUR_UI::editor_realized));
60
61         return 0;
62 }
63
64 void
65 ARDOUR_UI::install_actions ()
66 {
67         Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
68         Glib::RefPtr<Action> act;
69
70         /* menus + submenus that need action items */
71
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"));
84
85         /* the real actions */
86
87         act = ActionManager::register_action (main_actions, X_("New"), _("New"),  bind (mem_fun(*this, &ARDOUR_UI::new_session), false, string ()));
88
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);
93
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);
96
97         
98         /* <CMT Additions> */
99
100         PathScanner scanner;
101         vector<string*>* results = scanner (getenv ("PATH"), "AniComp", false, false);
102
103         if (results) {
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);
107                 }
108                 delete results;
109         }
110
111         /* </CMT Additions> */
112
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);
115
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);
118
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);
121
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);
125
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);
129
130         act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
131         ActionManager::session_sensitive_actions.push_back (act);
132
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);
137         
138         /* JACK actions for controlling ... JACK */
139
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"));
143         
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);
146
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);
149         
150         RadioAction::Group jack_latency_group;
151         
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);
170         
171         /* these actions are intended to be shared across all windows */
172         
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)));
177
178         /* windows visibility actions */
179
180         ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
181
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);
209
210         Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
211
212         /* do-nothing action for the "transport" menu bar item */
213
214         ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
215
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.
218         */
219         
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);
226
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);
239
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);
270
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.
274         */
275
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);
294
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);
297
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);
362
363         Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
364         
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));
367
368         Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
369
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);
380
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);
383
384         RadioAction::Group file_header_group;
385
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));
392
393         RadioAction::Group file_data_group;
394
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));
397
398         RadioAction::Group connect_outputs_group;
399
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);
406
407         RadioAction::Group monitoring_group;
408
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));
412
413         /* Configuration object options (i.e. not session specific) */
414
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));
421
422         /* session options */
423         
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);
426
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);
429
430         RadioAction::Group solo_group;
431
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);
436
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);
441
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);
448
449         /* initialize state of non-session dependent options */
450         
451         setup_config_options ();
452 }
453
454 void
455 ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
456 {
457         if (!session) {
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.
461                 */
462                 return;
463         }
464
465         if (cpi->protocol == 0) {
466                 ControlProtocolManager::instance().instantiate (*cpi);
467         } else {
468                 ControlProtocolManager::instance().teardown (*cpi);
469         }
470 }
471
472 void
473 ARDOUR_UI::build_control_surface_menu ()
474 {
475         list<ControlProtocolInfo*>::iterator i;
476
477         /* !!! this has to match the top level entry from ardour.menus */
478
479         string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
480
481         for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
482
483                 if (!(*i)->mandatory) {
484
485                         string action_name = "Toggle";
486                         action_name += legalize_for_path ((*i)->name);
487                         action_name += "Surface";
488                         
489                         string action_label = (*i)->name;
490                         
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)));
493                         
494                         Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
495                         
496                         if ((*i)->protocol || (*i)->requested) {
497                                 tact->set_active ();
498                         }
499                         
500                         ui += "<menuitem action='";
501                         ui += action_name;
502                         ui += "'/>\n";
503                 }
504         }
505
506         ui += "</menu>\n</menu>\n</menubar>\n";
507
508         ActionManager::ui_manager->add_ui_from_string (ui);
509 }
510
511 void
512 ARDOUR_UI::build_menu_bar ()
513 {
514         build_control_surface_menu ();
515
516         menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
517         menu_bar->set_name ("MainMenuBar");
518
519         /*
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.
523          */
524         Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;  
525         
526         wall_clock_box.add (wall_clock_label);
527         wall_clock_box.set_name ("WallClock");
528         wall_clock_label.set_name ("WallClock");
529
530         disk_space_box.add (disk_space_label);
531         disk_space_box.set_name ("WallClock");
532         disk_space_label.set_name ("WallClock");
533
534         cpu_load_box.add (cpu_load_label);
535         cpu_load_box.set_name ("CPULoad");
536         cpu_load_label.set_name ("CPULoad");
537
538         buffer_load_box.add (buffer_load_label);
539         buffer_load_box.set_name ("BufferLoad");
540         buffer_load_label.set_name ("BufferLoad");
541
542         sample_rate_box.add (sample_rate_label);
543         sample_rate_box.set_name ("SampleRate");
544         sample_rate_label.set_name ("SampleRate");
545
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);
552
553         menu_bar_base.set_name ("MainMenuBar");
554         menu_bar_base.add (menu_hbox);
555 }