Merging from trunk
[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         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         
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_("Save"), _("Save"),  bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
202         ActionManager::session_sensitive_actions.push_back (act);
203         act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), mem_fun(*this, &ARDOUR_UI::remove_last_capture));
204         ActionManager::session_sensitive_actions.push_back (act);
205
206         Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
207
208         /* do-nothing action for the "transport" menu bar item */
209
210         ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
211
212         /* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
213            menus and via button proxies.
214         */
215         
216         act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), mem_fun(*this, &ARDOUR_UI::transport_stop));
217         ActionManager::session_sensitive_actions.push_back (act);
218         ActionManager::transport_sensitive_actions.push_back (act);
219         act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), mem_fun(*this, &ARDOUR_UI::transport_roll));
220         ActionManager::session_sensitive_actions.push_back (act);
221         ActionManager::transport_sensitive_actions.push_back (act);
222
223         ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false));
224         ActionManager::session_sensitive_actions.push_back (act);
225         ActionManager::transport_sensitive_actions.push_back (act);
226         ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true));
227         ActionManager::session_sensitive_actions.push_back (act);
228         ActionManager::transport_sensitive_actions.push_back (act);
229         act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
230         ActionManager::session_sensitive_actions.push_back (act);
231         ActionManager::transport_sensitive_actions.push_back (act);
232         act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), mem_fun(*this, &ARDOUR_UI::transport_play_selection));
233         ActionManager::session_sensitive_actions.push_back (act);
234         ActionManager::transport_sensitive_actions.push_back (act);
235
236         act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), mem_fun(*this, &ARDOUR_UI::transport_record));
237         ActionManager::session_sensitive_actions.push_back (act);
238         ActionManager::transport_sensitive_actions.push_back (act);
239         act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
240         ActionManager::session_sensitive_actions.push_back (act);
241         ActionManager::transport_sensitive_actions.push_back (act);
242         act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
243         ActionManager::session_sensitive_actions.push_back (act);
244         ActionManager::transport_sensitive_actions.push_back (act);
245         act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
246         ActionManager::session_sensitive_actions.push_back (act);
247         ActionManager::transport_sensitive_actions.push_back (act);
248         act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
249         ActionManager::session_sensitive_actions.push_back (act);
250         ActionManager::transport_sensitive_actions.push_back (act);
251         act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
252         ActionManager::session_sensitive_actions.push_back (act);
253         ActionManager::transport_sensitive_actions.push_back (act);
254         act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
255         ActionManager::session_sensitive_actions.push_back (act);
256         ActionManager::transport_sensitive_actions.push_back (act);
257         act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Goto Zero"), mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
258         ActionManager::session_sensitive_actions.push_back (act);
259         ActionManager::transport_sensitive_actions.push_back (act);
260         act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Goto Start"), mem_fun(*this, &ARDOUR_UI::transport_goto_start));
261         ActionManager::session_sensitive_actions.push_back (act);
262         ActionManager::transport_sensitive_actions.push_back (act);
263         act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Goto End"), mem_fun(*this, &ARDOUR_UI::transport_goto_end));
264         ActionManager::session_sensitive_actions.push_back (act);
265         ActionManager::transport_sensitive_actions.push_back (act);
266
267         /* XXX the newline in the displayed names of these action is really wrong, but its because we want the button
268            that proxies for these action to be more compact. It would be nice to find a way to override the action
269            name appearance on the buttons.
270         */
271
272         act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch\nin"), mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
273         ActionManager::session_sensitive_actions.push_back (act);
274         ActionManager::transport_sensitive_actions.push_back (act);
275         act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch\nout"), mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
276         ActionManager::session_sensitive_actions.push_back (act);
277         ActionManager::transport_sensitive_actions.push_back (act);
278         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), mem_fun(*this, &ARDOUR_UI::toggle_click));
279         ActionManager::session_sensitive_actions.push_back (act);
280         ActionManager::transport_sensitive_actions.push_back (act);
281         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto\ninput"), mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
282         ActionManager::session_sensitive_actions.push_back (act);
283         ActionManager::transport_sensitive_actions.push_back (act);
284         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto\nplay"), mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
285         ActionManager::session_sensitive_actions.push_back (act);
286         ActionManager::transport_sensitive_actions.push_back (act);
287         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto\nreturn"), mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
288         ActionManager::session_sensitive_actions.push_back (act);
289         ActionManager::transport_sensitive_actions.push_back (act);
290
291         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time\nmaster"), mem_fun(*this, &ARDOUR_UI::toggle_time_master));
292         ActionManager::session_sensitive_actions.push_back (act);
293
294         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  0U));
295         ActionManager::session_sensitive_actions.push_back (act);
296         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  1U));
297         ActionManager::session_sensitive_actions.push_back (act);
298         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  2U));
299         ActionManager::session_sensitive_actions.push_back (act);
300         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  3U));
301         ActionManager::session_sensitive_actions.push_back (act);
302         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  4U));
303         ActionManager::session_sensitive_actions.push_back (act);
304         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  5U));
305         ActionManager::session_sensitive_actions.push_back (act);
306         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  6U));
307         ActionManager::session_sensitive_actions.push_back (act);
308         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  7U));
309         ActionManager::session_sensitive_actions.push_back (act);
310         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  8U));
311         ActionManager::session_sensitive_actions.push_back (act);
312         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U));
313         ActionManager::session_sensitive_actions.push_back (act);
314         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U));
315         ActionManager::session_sensitive_actions.push_back (act);
316         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U));
317         ActionManager::session_sensitive_actions.push_back (act);
318         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U));
319         ActionManager::session_sensitive_actions.push_back (act);
320         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U));
321         ActionManager::session_sensitive_actions.push_back (act);
322         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U));
323         ActionManager::session_sensitive_actions.push_back (act);
324         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U));
325         ActionManager::session_sensitive_actions.push_back (act);
326         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U));
327         ActionManager::session_sensitive_actions.push_back (act);
328         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U));
329         ActionManager::session_sensitive_actions.push_back (act);
330         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U));
331         ActionManager::session_sensitive_actions.push_back (act);
332         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U));
333         ActionManager::session_sensitive_actions.push_back (act);
334         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U));
335         ActionManager::session_sensitive_actions.push_back (act);
336         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U));
337         ActionManager::session_sensitive_actions.push_back (act);
338         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U));
339         ActionManager::session_sensitive_actions.push_back (act);
340         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U));
341         ActionManager::session_sensitive_actions.push_back (act);
342         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U));
343         ActionManager::session_sensitive_actions.push_back (act);
344         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U));
345         ActionManager::session_sensitive_actions.push_back (act);
346         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U));
347         ActionManager::session_sensitive_actions.push_back (act);
348         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U));
349         ActionManager::session_sensitive_actions.push_back (act);
350         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U));
351         ActionManager::session_sensitive_actions.push_back (act);
352         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U));
353         ActionManager::session_sensitive_actions.push_back (act);
354         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U));
355         ActionManager::session_sensitive_actions.push_back (act);
356         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U));
357         ActionManager::session_sensitive_actions.push_back (act);
358
359         Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
360         
361         shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
362         shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
363
364         Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
365
366         act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
367         ActionManager::session_sensitive_actions.push_back (act);
368         act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
369         ActionManager::session_sensitive_actions.push_back (act);
370         act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
371         ActionManager::session_sensitive_actions.push_back (act);
372         act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
373         ActionManager::session_sensitive_actions.push_back (act);
374         act = ActionManager::register_toggle_action (option_actions, X_("UseMIDIcontrol"), _("Use MIDI control"), mem_fun (*this, &ARDOUR_UI::toggle_use_midi_control));
375         ActionManager::session_sensitive_actions.push_back (act);
376
377         act = ActionManager::register_toggle_action (option_actions, X_("AutoConnectNewTrackInputsToHardware"), _("Connect new track inputs to hardware"), mem_fun (*this, &ARDOUR_UI::toggle_AutoConnectNewTrackInputsToHardware));
378         ActionManager::session_sensitive_actions.push_back (act);
379
380         RadioAction::Group file_header_group;
381
382         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));
383         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));
384         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));
385         // 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));
386         // 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));
387         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));
388
389         RadioAction::Group file_data_group;
390
391         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));
392         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));
393
394         RadioAction::Group connect_outputs_group;
395
396         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));
397         ActionManager::session_sensitive_actions.push_back (act);
398         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));
399         ActionManager::session_sensitive_actions.push_back (act);
400         act = ActionManager::register_radio_action (option_actions, connect_outputs_group, X_("ManuallyConnectNewTrackOutputs"), _("Manually connect new track outputs"), mem_fun (*this, &ARDOUR_UI::toggle_ManuallyConnectNewTrackOutputs));
401         ActionManager::session_sensitive_actions.push_back (act);
402
403         RadioAction::Group monitoring_group;
404
405         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseHardwareMonitoring"), _("Hardware monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseHardwareMonitoring));
406         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseSoftwareMonitoring"), _("Software monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseSoftwareMonitoring));
407         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseExternalMonitoring"), _("External monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseExternalMonitoring));
408
409         /* Configuration object options (i.e. not session specific) */
410
411         ActionManager::register_toggle_action (option_actions, X_("StopPluginsWithTransport"), _("Stop plugins with transport"), mem_fun (*this, &ARDOUR_UI::toggle_StopPluginsWithTransport));
412         ActionManager::register_toggle_action (option_actions, X_("VerifyRemoveLastCapture"), _("Verify remove last capture"), mem_fun (*this, &ARDOUR_UI::toggle_VerifyRemoveLastCapture));
413         ActionManager::register_toggle_action (option_actions, X_("StopRecordingOnXrun"), _("Stop recording on xrun"), mem_fun (*this, &ARDOUR_UI::toggle_StopRecordingOnXrun));
414         ActionManager::register_toggle_action (option_actions, X_("StopTransportAtEndOfSession"), _("Stop transport at session end"), mem_fun (*this, &ARDOUR_UI::toggle_StopTransportAtEndOfSession));
415         ActionManager::register_toggle_action (option_actions, X_("GainReduceFastTransport"), _("-12dB gain reduce ffwd/rewind"), mem_fun (*this, &ARDOUR_UI::toggle_GainReduceFastTransport));
416         ActionManager::register_toggle_action (option_actions, X_("LatchedRecordEnable"), _("Rec-enable stays engaged at stop"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedRecordEnable));
417
418         /* session options */
419         
420         act = ActionManager::register_toggle_action (option_actions, X_("DoNotRunPluginsWhileRecording"), _("Do not run plugins while recording"), mem_fun (*this, &ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording));
421         ActionManager::session_sensitive_actions.push_back (act);
422
423         act = ActionManager::register_toggle_action (option_actions, X_("LatchedSolo"), _("Latched solo"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedSolo));
424         ActionManager::session_sensitive_actions.push_back (act);
425
426         RadioAction::Group solo_group;
427
428         act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloInPlace"), _("Solo in-place"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
429         ActionManager::session_sensitive_actions.push_back (act);
430         act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloViaBus"), _("Solo via bus"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
431         ActionManager::session_sensitive_actions.push_back (act);
432
433         act = ActionManager::register_action (option_actions, X_("AutomaticallyCreateCrossfades"), _("Automatically create crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_AutomaticallyCreateCrossfades));
434         ActionManager::session_sensitive_actions.push_back (act);
435         act = ActionManager::register_action (option_actions, X_("UnmuteNewFullCrossfades"), _("Unmute new full crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_UnmuteNewFullCrossfades));
436         ActionManager::session_sensitive_actions.push_back (act);
437
438         ActionManager::add_action_group (shuttle_actions);
439         ActionManager::add_action_group (option_actions);
440         ActionManager::add_action_group (jack_actions);
441         ActionManager::add_action_group (transport_actions);
442         ActionManager::add_action_group (main_actions);
443         ActionManager::add_action_group (common_actions);
444
445         /* initialize state of non-session dependent options */
446         
447         setup_config_options ();
448 }
449
450 void
451 ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
452 {
453         if (!session) {
454                 /* this happens when we build the menu bar when control protocol support
455                    has been used in the past for some given protocol - the item needs
456                    to be made active, but there is no session yet.
457                 */
458                 return;
459         }
460
461         if (cpi->protocol == 0) {
462                 ControlProtocolManager::instance().instantiate (*cpi);
463         } else {
464                 ControlProtocolManager::instance().teardown (*cpi);
465         }
466 }
467
468 void
469 ARDOUR_UI::build_control_surface_menu ()
470 {
471         list<ControlProtocolInfo*>::iterator i;
472
473         /* !!! this has to match the top level entry from ardour.menus */
474
475         string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
476
477         for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
478
479                 if (!(*i)->mandatory) {
480
481                         string action_name = "Toggle";
482                         action_name += legalize_for_path ((*i)->name);
483                         action_name += "Surface";
484                         
485                         string action_label = (*i)->name;
486                         
487                         Glib::RefPtr<Action> act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), action_label.c_str(),
488                                                                                           (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), *i)));
489                         
490                         Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
491                         
492                         if ((*i)->protocol || (*i)->requested) {
493                                 tact->set_active ();
494                         }
495                         
496                         ui += "<menuitem action='";
497                         ui += action_name;
498                         ui += "'/>\n";
499                 }
500         }
501
502         ui += "</menu>\n</menu>\n</menubar>\n";
503
504         ActionManager::ui_manager->add_ui_from_string (ui);
505 }
506
507 void
508 ARDOUR_UI::build_menu_bar ()
509 {
510         build_control_surface_menu ();
511
512         menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
513         menu_bar->set_name ("MainMenuBar");
514
515         /*
516          * This is needed because this property does not get installed
517          * until the Menu GObject class is registered, which happens
518          * when the first menu instance is created.
519          */
520         Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;  
521         
522         wall_clock_box.add (wall_clock_label);
523         wall_clock_box.set_name ("WallClock");
524         wall_clock_label.set_name ("WallClock");
525
526         disk_space_box.add (disk_space_label);
527         disk_space_box.set_name ("WallClock");
528         disk_space_label.set_name ("WallClock");
529
530         cpu_load_box.add (cpu_load_label);
531         cpu_load_box.set_name ("CPULoad");
532         cpu_load_label.set_name ("CPULoad");
533
534         buffer_load_box.add (buffer_load_label);
535         buffer_load_box.set_name ("BufferLoad");
536         buffer_load_label.set_name ("BufferLoad");
537
538         sample_rate_box.add (sample_rate_label);
539         sample_rate_box.set_name ("SampleRate");
540         sample_rate_label.set_name ("SampleRate");
541
542         menu_hbox.pack_start (*menu_bar, true, true);
543         menu_hbox.pack_end (wall_clock_box, false, false, 10);
544         menu_hbox.pack_end (disk_space_box, false, false, 10);
545         menu_hbox.pack_end (cpu_load_box, false, false, 10);
546         menu_hbox.pack_end (buffer_load_box, false, false, 10);
547         menu_hbox.pack_end (sample_rate_box, false, false, 10);
548
549         menu_bar_base.set_name ("MainMenuBar");
550         menu_bar_base.add (menu_hbox);
551 }