3add2a150cba6e63826115fbed4ce19ec3af6df5
[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 Gtk;
44 using namespace Gtkmm2ext;
45
46 int
47 ARDOUR_UI::create_editor ()
48
49 {
50         try {
51                 editor = new Editor (*engine);
52         }
53
54         catch (failed_constructor& err) {
55                 return -1;
56         }
57
58         editor->Realized.connect (mem_fun (*this, &ARDOUR_UI::editor_realized));
59
60         return 0;
61 }
62
63 void
64 ARDOUR_UI::install_actions ()
65 {
66         Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
67         Glib::RefPtr<Action> act;
68
69         /* menus + submenus that need action items */
70
71         ActionManager::register_action (main_actions, X_("Session"), _("Session"));
72         ActionManager::register_action (main_actions, X_("Export"), _("Export"));
73         ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
74         ActionManager::register_action (main_actions, X_("Sync"), _("Sync"));
75         ActionManager::register_action (main_actions, X_("Options"), _("Options"));
76         ActionManager::register_action (main_actions, X_("TransportOptions"), _("Options"));
77         ActionManager::register_action (main_actions, X_("Help"), _("Help"));
78         ActionManager::register_action (main_actions, X_("KeyMouse Actions"), _("KeyMouse Actions"));
79         ActionManager::register_action (main_actions, X_("AudioFileFormat"), _("Audio File Format"));
80         ActionManager::register_action (main_actions, X_("AudioFileFormatHeader"), _("Header"));
81         ActionManager::register_action (main_actions, X_("AudioFileFormatData"), _("Data"));
82         ActionManager::register_action (main_actions, X_("ControlSurfaces"), _("Control Surfaces"));
83
84         /* the real actions */
85
86         act = ActionManager::register_action (main_actions, X_("New"), _("New"),  bind (mem_fun(*this, &ARDOUR_UI::new_session), false, string ()));
87
88         ActionManager::register_action (main_actions, X_("Open"), _("Open"),  mem_fun(*this, &ARDOUR_UI::open_session));
89         ActionManager::register_action (main_actions, X_("Recent"), _("Recent"),  mem_fun(*this, &ARDOUR_UI::open_recent_session));
90         act = ActionManager::register_action (main_actions, X_("Close"), _("Close"),  mem_fun(*this, &ARDOUR_UI::close_session));
91         ActionManager::session_sensitive_actions.push_back (act);
92
93         act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus"),  mem_fun(*this, &ARDOUR_UI::add_route));
94         ActionManager::session_sensitive_actions.push_back (act);
95
96         
97         /* <CMT Additions> */
98
99         PathScanner scanner;
100         vector<string*>* results = scanner (getenv ("PATH"), "AniComp", false, false);
101
102         if (results) {
103                 if (!results->empty()) {
104                         act = ActionManager::register_action (main_actions, X_("aniConnect"), _("Connect"),  (mem_fun (*editor, &PublicEditor::connect_to_image_compositor)));
105                         ActionManager::session_sensitive_actions.push_back (act);
106                 }
107                 delete results;
108         }
109
110         /* </CMT Additions> */
111
112         act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot"),  mem_fun(*this, &ARDOUR_UI::snapshot_session));
113         ActionManager::session_sensitive_actions.push_back (act);
114
115         act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."),  mem_fun(*this, &ARDOUR_UI::save_template));
116         ActionManager::session_sensitive_actions.push_back (act);
117
118         act = ActionManager::register_action (main_actions, X_("ExportSession"), _("Export session to audiofile..."),  mem_fun (*editor, &PublicEditor::export_session));
119         ActionManager::session_sensitive_actions.push_back (act);
120
121         act = ActionManager::register_action (main_actions, X_("ExportSelection"), _("Export selection to audiofile..."),  mem_fun (*editor, &PublicEditor::export_selection));
122         ActionManager::session_sensitive_actions.push_back (act);
123         ActionManager::time_selection_sensitive_actions.push_back (act);
124
125         act = ActionManager::register_action (main_actions, X_("ExportRangeMarkers"), _("Export range markers to audiofile..."),  mem_fun (*editor, &PublicEditor::export_range_markers));
126         ActionManager::session_sensitive_actions.push_back (act);
127         ActionManager::range_sensitive_actions.push_back (act);
128
129         act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
130         ActionManager::session_sensitive_actions.push_back (act);
131
132         act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Cleanup unused sources"),  mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
133         ActionManager::session_sensitive_actions.push_back (act);
134         act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush wastebasket"),  mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
135         ActionManager::session_sensitive_actions.push_back (act);
136         
137         /* JACK actions for controlling ... JACK */
138
139         Glib::RefPtr<ActionGroup> jack_actions = ActionGroup::create (X_("JACK"));
140         ActionManager::register_action (jack_actions, X_("JACK"), _("JACK"));
141         ActionManager::register_action (jack_actions, X_("Latency"), _("Latency"));
142         
143         act = ActionManager::register_action (jack_actions, X_("JACKReconnect"), _("Reconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::reconnect_to_jack));
144         ActionManager::jack_opposite_sensitive_actions.push_back (act);
145
146         act = ActionManager::register_action (jack_actions, X_("JACKDisconnect"), _("Disconnect"), mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::disconnect_from_jack));
147         ActionManager::jack_sensitive_actions.push_back (act);
148         
149         RadioAction::Group jack_latency_group;
150         
151         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));
152         ActionManager::jack_sensitive_actions.push_back (act);
153         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));
154         ActionManager::jack_sensitive_actions.push_back (act);
155         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));
156         ActionManager::jack_sensitive_actions.push_back (act);
157         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));
158         ActionManager::jack_sensitive_actions.push_back (act);
159         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));
160         ActionManager::jack_sensitive_actions.push_back (act);
161         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));
162         ActionManager::jack_sensitive_actions.push_back (act);
163         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));
164         ActionManager::jack_sensitive_actions.push_back (act);
165         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));
166         ActionManager::jack_sensitive_actions.push_back (act);
167         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));
168         ActionManager::jack_sensitive_actions.push_back (act);
169         
170         /* these actions are intended to be shared across all windows */
171         
172         common_actions = ActionGroup::create (X_("Common"));
173         ActionManager::register_action (main_actions, X_("Windows"), _("Windows"));
174         ActionManager::register_action (common_actions, X_("Start-Prefix"), _("start prefix"), mem_fun(*this, &ARDOUR_UI::start_keyboard_prefix));
175         ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (mem_fun(*this, &ARDOUR_UI::finish)));
176
177         /* windows visibility actions */
178
179         ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
180
181         ActionManager::register_action (common_actions, X_("goto-editor"), _("Show Editor"),  mem_fun(*this, &ARDOUR_UI::goto_editor_window));
182         ActionManager::register_action (common_actions, X_("goto-mixer"), _("Show Mixer"),  mem_fun(*this, &ARDOUR_UI::goto_mixer_window));
183         ActionManager::register_toggle_action (common_actions, X_("ToggleSoundFileBrowser"), _("Sound File Browser"), mem_fun(*this, &ARDOUR_UI::toggle_sound_file_browser));
184         ActionManager::register_toggle_action (common_actions, X_("ToggleOptionsEditor"), _("Options Editor"), mem_fun(*this, &ARDOUR_UI::toggle_options_window));
185         act = ActionManager::register_toggle_action (common_actions, X_("ToggleInspector"), _("Track/Bus Inspector"), mem_fun(*this, &ARDOUR_UI::toggle_route_params_window));
186         ActionManager::session_sensitive_actions.push_back (act);
187         act = ActionManager::register_toggle_action (common_actions, X_("ToggleConnections"), _("Connections"), mem_fun(*this, &ARDOUR_UI::toggle_connection_editor));
188         ActionManager::session_sensitive_actions.push_back (act);
189         act = ActionManager::register_toggle_action (common_actions, X_("ToggleLocations"), _("Locations"), mem_fun(*this, &ARDOUR_UI::toggle_location_window));
190         ActionManager::session_sensitive_actions.push_back (act);
191         act = ActionManager::register_toggle_action (common_actions, X_("ToggleBigClock"), _("Big Clock"), mem_fun(*this, &ARDOUR_UI::toggle_big_clock_window));
192         ActionManager::session_sensitive_actions.push_back (act);
193         ActionManager::register_action (common_actions, X_("About"), _("About"),  mem_fun(*this, &ARDOUR_UI::show_splash));
194         act = ActionManager::register_toggle_action (common_actions, X_("ToggleColorManager"), _("Colors"), mem_fun(*this, &ARDOUR_UI::toggle_color_manager));
195         
196         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));
197         ActionManager::session_sensitive_actions.push_back (act);
198         act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1));
199         ActionManager::session_sensitive_actions.push_back (act);
200         act = ActionManager::register_action (common_actions, X_("Save"), _("Save"),  bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
201         ActionManager::session_sensitive_actions.push_back (act);
202         act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), mem_fun(*this, &ARDOUR_UI::remove_last_capture));
203         ActionManager::session_sensitive_actions.push_back (act);
204
205         Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
206
207         /* do-nothing action for the "transport" menu bar item */
208
209         ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
210
211         /* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
212            menus and via button proxies.
213         */
214         
215         act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), mem_fun(*this, &ARDOUR_UI::transport_stop));
216         ActionManager::session_sensitive_actions.push_back (act);
217         ActionManager::transport_sensitive_actions.push_back (act);
218         act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), mem_fun(*this, &ARDOUR_UI::transport_roll));
219         ActionManager::session_sensitive_actions.push_back (act);
220         ActionManager::transport_sensitive_actions.push_back (act);
221
222         ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false));
223         ActionManager::session_sensitive_actions.push_back (act);
224         ActionManager::transport_sensitive_actions.push_back (act);
225         ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true));
226         ActionManager::session_sensitive_actions.push_back (act);
227         ActionManager::transport_sensitive_actions.push_back (act);
228         act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
229         ActionManager::session_sensitive_actions.push_back (act);
230         ActionManager::transport_sensitive_actions.push_back (act);
231         act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), mem_fun(*this, &ARDOUR_UI::transport_play_selection));
232         ActionManager::session_sensitive_actions.push_back (act);
233         ActionManager::transport_sensitive_actions.push_back (act);
234
235         act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), mem_fun(*this, &ARDOUR_UI::transport_record));
236         ActionManager::session_sensitive_actions.push_back (act);
237         ActionManager::transport_sensitive_actions.push_back (act);
238         act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
239         ActionManager::session_sensitive_actions.push_back (act);
240         ActionManager::transport_sensitive_actions.push_back (act);
241         act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
242         ActionManager::session_sensitive_actions.push_back (act);
243         ActionManager::transport_sensitive_actions.push_back (act);
244         act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
245         ActionManager::session_sensitive_actions.push_back (act);
246         ActionManager::transport_sensitive_actions.push_back (act);
247         act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
248         ActionManager::session_sensitive_actions.push_back (act);
249         ActionManager::transport_sensitive_actions.push_back (act);
250         act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
251         ActionManager::session_sensitive_actions.push_back (act);
252         ActionManager::transport_sensitive_actions.push_back (act);
253         act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), bind (mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
254         ActionManager::session_sensitive_actions.push_back (act);
255         ActionManager::transport_sensitive_actions.push_back (act);
256         act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Goto Zero"), mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
257         ActionManager::session_sensitive_actions.push_back (act);
258         ActionManager::transport_sensitive_actions.push_back (act);
259         act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Goto Start"), mem_fun(*this, &ARDOUR_UI::transport_goto_start));
260         ActionManager::session_sensitive_actions.push_back (act);
261         ActionManager::transport_sensitive_actions.push_back (act);
262         act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Goto End"), mem_fun(*this, &ARDOUR_UI::transport_goto_end));
263         ActionManager::session_sensitive_actions.push_back (act);
264         ActionManager::transport_sensitive_actions.push_back (act);
265
266         /* XXX the newline in the displayed names of these action is really wrong, but its because we want the button
267            that proxies for these action to be more compact. It would be nice to find a way to override the action
268            name appearance on the buttons.
269         */
270
271         act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch\nin"), mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
272         ActionManager::session_sensitive_actions.push_back (act);
273         ActionManager::transport_sensitive_actions.push_back (act);
274         act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch\nout"), mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
275         ActionManager::session_sensitive_actions.push_back (act);
276         ActionManager::transport_sensitive_actions.push_back (act);
277         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), mem_fun(*this, &ARDOUR_UI::toggle_click));
278         ActionManager::session_sensitive_actions.push_back (act);
279         ActionManager::transport_sensitive_actions.push_back (act);
280         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto\ninput"), mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
281         ActionManager::session_sensitive_actions.push_back (act);
282         ActionManager::transport_sensitive_actions.push_back (act);
283         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto\nplay"), mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
284         ActionManager::session_sensitive_actions.push_back (act);
285         ActionManager::transport_sensitive_actions.push_back (act);
286         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto\nreturn"), mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
287         ActionManager::session_sensitive_actions.push_back (act);
288         ActionManager::transport_sensitive_actions.push_back (act);
289
290         act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time\nmaster"), mem_fun(*this, &ARDOUR_UI::toggle_time_master));
291         ActionManager::session_sensitive_actions.push_back (act);
292
293         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  0U));
294         ActionManager::session_sensitive_actions.push_back (act);
295         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  1U));
296         ActionManager::session_sensitive_actions.push_back (act);
297         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  2U));
298         ActionManager::session_sensitive_actions.push_back (act);
299         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  3U));
300         ActionManager::session_sensitive_actions.push_back (act);
301         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  4U));
302         ActionManager::session_sensitive_actions.push_back (act);
303         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  5U));
304         ActionManager::session_sensitive_actions.push_back (act);
305         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  6U));
306         ActionManager::session_sensitive_actions.push_back (act);
307         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  7U));
308         ActionManager::session_sensitive_actions.push_back (act);
309         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  8U));
310         ActionManager::session_sensitive_actions.push_back (act);
311         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U));
312         ActionManager::session_sensitive_actions.push_back (act);
313         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U));
314         ActionManager::session_sensitive_actions.push_back (act);
315         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U));
316         ActionManager::session_sensitive_actions.push_back (act);
317         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U));
318         ActionManager::session_sensitive_actions.push_back (act);
319         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U));
320         ActionManager::session_sensitive_actions.push_back (act);
321         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U));
322         ActionManager::session_sensitive_actions.push_back (act);
323         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U));
324         ActionManager::session_sensitive_actions.push_back (act);
325         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U));
326         ActionManager::session_sensitive_actions.push_back (act);
327         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U));
328         ActionManager::session_sensitive_actions.push_back (act);
329         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U));
330         ActionManager::session_sensitive_actions.push_back (act);
331         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U));
332         ActionManager::session_sensitive_actions.push_back (act);
333         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U));
334         ActionManager::session_sensitive_actions.push_back (act);
335         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U));
336         ActionManager::session_sensitive_actions.push_back (act);
337         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U));
338         ActionManager::session_sensitive_actions.push_back (act);
339         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U));
340         ActionManager::session_sensitive_actions.push_back (act);
341         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U));
342         ActionManager::session_sensitive_actions.push_back (act);
343         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U));
344         ActionManager::session_sensitive_actions.push_back (act);
345         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U));
346         ActionManager::session_sensitive_actions.push_back (act);
347         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U));
348         ActionManager::session_sensitive_actions.push_back (act);
349         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U));
350         ActionManager::session_sensitive_actions.push_back (act);
351         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U));
352         ActionManager::session_sensitive_actions.push_back (act);
353         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U));
354         ActionManager::session_sensitive_actions.push_back (act);
355         act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U));
356         ActionManager::session_sensitive_actions.push_back (act);
357
358         Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
359         
360         shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
361         shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
362
363         Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
364
365         act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
366         ActionManager::session_sensitive_actions.push_back (act);
367         act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
368         ActionManager::session_sensitive_actions.push_back (act);
369         act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
370         ActionManager::session_sensitive_actions.push_back (act);
371         act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
372         ActionManager::session_sensitive_actions.push_back (act);
373         act = ActionManager::register_toggle_action (option_actions, X_("UseMIDIcontrol"), _("Use MIDI control"), mem_fun (*this, &ARDOUR_UI::toggle_use_midi_control));
374         ActionManager::session_sensitive_actions.push_back (act);
375
376         act = ActionManager::register_toggle_action (option_actions, X_("AutoConnectNewTrackInputsToHardware"), _("Connect new track inputs to hardware"), mem_fun (*this, &ARDOUR_UI::toggle_AutoConnectNewTrackInputsToHardware));
377         ActionManager::session_sensitive_actions.push_back (act);
378
379         RadioAction::Group file_header_group;
380
381         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));
382         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));
383         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));
384         // 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));
385         // 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));
386         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));
387
388         RadioAction::Group file_data_group;
389
390         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));
391         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));
392
393         RadioAction::Group connect_outputs_group;
394
395         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));
396         ActionManager::session_sensitive_actions.push_back (act);
397         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));
398         ActionManager::session_sensitive_actions.push_back (act);
399         act = ActionManager::register_radio_action (option_actions, connect_outputs_group, X_("ManuallyConnectNewTrackOutputs"), _("Manually connect new track outputs"), mem_fun (*this, &ARDOUR_UI::toggle_ManuallyConnectNewTrackOutputs));
400         ActionManager::session_sensitive_actions.push_back (act);
401
402         RadioAction::Group monitoring_group;
403
404         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseHardwareMonitoring"), _("Hardware monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseHardwareMonitoring));
405         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseSoftwareMonitoring"), _("Software monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseSoftwareMonitoring));
406         act = ActionManager::register_radio_action (option_actions, monitoring_group, X_("UseExternalMonitoring"), _("External monitoring"), mem_fun (*this, &ARDOUR_UI::toggle_UseExternalMonitoring));
407
408         /* Configuration object options (i.e. not session specific) */
409
410         ActionManager::register_toggle_action (option_actions, X_("StopPluginsWithTransport"), _("Stop plugins with transport"), mem_fun (*this, &ARDOUR_UI::toggle_StopPluginsWithTransport));
411         ActionManager::register_toggle_action (option_actions, X_("VerifyRemoveLastCapture"), _("Verify remove last capture"), mem_fun (*this, &ARDOUR_UI::toggle_VerifyRemoveLastCapture));
412         ActionManager::register_toggle_action (option_actions, X_("StopRecordingOnXrun"), _("Stop recording on xrun"), mem_fun (*this, &ARDOUR_UI::toggle_StopRecordingOnXrun));
413         ActionManager::register_toggle_action (option_actions, X_("StopTransportAtEndOfSession"), _("Stop transport at session end"), mem_fun (*this, &ARDOUR_UI::toggle_StopTransportAtEndOfSession));
414         ActionManager::register_toggle_action (option_actions, X_("GainReduceFastTransport"), _("-12dB gain reduce ffwd/rewind"), mem_fun (*this, &ARDOUR_UI::toggle_GainReduceFastTransport));
415         ActionManager::register_toggle_action (option_actions, X_("LatchedRecordEnable"), _("Rec-enable stays engaged at stop"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedRecordEnable));
416
417         /* session options */
418         
419         act = ActionManager::register_toggle_action (option_actions, X_("DoNotRunPluginsWhileRecording"), _("Do not run plugins while recording"), mem_fun (*this, &ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording));
420         ActionManager::session_sensitive_actions.push_back (act);
421
422         act = ActionManager::register_toggle_action (option_actions, X_("LatchedSolo"), _("Latched solo"), mem_fun (*this, &ARDOUR_UI::toggle_LatchedSolo));
423         ActionManager::session_sensitive_actions.push_back (act);
424
425         RadioAction::Group solo_group;
426
427         act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloInPlace"), _("Solo in-place"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
428         ActionManager::session_sensitive_actions.push_back (act);
429         act = ActionManager::register_radio_action (option_actions, solo_group, X_("SoloViaBus"), _("Solo via bus"), mem_fun (*this, &ARDOUR_UI::toggle_SoloViaBus));
430         ActionManager::session_sensitive_actions.push_back (act);
431
432         act = ActionManager::register_action (option_actions, X_("AutomaticallyCreateCrossfades"), _("Automatically create crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_AutomaticallyCreateCrossfades));
433         ActionManager::session_sensitive_actions.push_back (act);
434         act = ActionManager::register_action (option_actions, X_("UnmuteNewFullCrossfades"), _("Unmute new full crossfades"), mem_fun (*this, &ARDOUR_UI::toggle_UnmuteNewFullCrossfades));
435         ActionManager::session_sensitive_actions.push_back (act);
436
437         ActionManager::add_action_group (shuttle_actions);
438         ActionManager::add_action_group (option_actions);
439         ActionManager::add_action_group (jack_actions);
440         ActionManager::add_action_group (transport_actions);
441         ActionManager::add_action_group (main_actions);
442         ActionManager::add_action_group (common_actions);
443
444         /* initialize state of non-session dependent options */
445         
446         setup_config_options ();
447 }
448
449 void
450 ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
451 {
452         if (!session) {
453                 /* this happens when we build the menu bar when control protocol support
454                    has been used in the past for some given protocol - the item needs
455                    to be made active, but there is no session yet.
456                 */
457                 return;
458         }
459
460         if (cpi->protocol == 0) {
461                 ControlProtocolManager::instance().instantiate (*cpi);
462         } else {
463                 ControlProtocolManager::instance().teardown (*cpi);
464         }
465 }
466
467 void
468 ARDOUR_UI::build_control_surface_menu ()
469 {
470         list<ControlProtocolInfo*>::iterator i;
471
472         /* !!! this has to match the top level entry from ardour.menus */
473
474         string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
475
476         for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
477
478                 if (!(*i)->mandatory) {
479
480                         string action_name = "Toggle";
481                         action_name += legalize_for_path ((*i)->name);
482                         action_name += "Surface";
483                         
484                         string action_label = (*i)->name;
485                         
486                         Glib::RefPtr<Action> act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), action_label.c_str(),
487                                                                                           (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), *i)));
488                         
489                         Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
490                         
491                         if ((*i)->protocol || (*i)->requested) {
492                                 tact->set_active ();
493                         }
494                         
495                         ui += "<menuitem action='";
496                         ui += action_name;
497                         ui += "'/>\n";
498                 }
499         }
500
501         ui += "</menu>\n</menu>\n</menubar>\n";
502
503         ActionManager::ui_manager->add_ui_from_string (ui);
504 }
505
506 void
507 ARDOUR_UI::build_menu_bar ()
508 {
509         build_control_surface_menu ();
510
511         menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
512         menu_bar->set_name ("MainMenuBar");
513
514         /*
515          * This is needed because this property does not get installed
516          * until the Menu GObject class is registered, which happens
517          * when the first menu instance is created.
518          */
519         Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;  
520         
521         wall_clock_box.add (wall_clock_label);
522         wall_clock_box.set_name ("WallClock");
523         wall_clock_label.set_name ("WallClock");
524
525         disk_space_box.add (disk_space_label);
526         disk_space_box.set_name ("WallClock");
527         disk_space_label.set_name ("WallClock");
528
529         cpu_load_box.add (cpu_load_label);
530         cpu_load_box.set_name ("CPULoad");
531         cpu_load_label.set_name ("CPULoad");
532
533         buffer_load_box.add (buffer_load_label);
534         buffer_load_box.set_name ("BufferLoad");
535         buffer_load_label.set_name ("BufferLoad");
536
537         sample_rate_box.add (sample_rate_label);
538         sample_rate_box.set_name ("SampleRate");
539         sample_rate_label.set_name ("SampleRate");
540
541         menu_hbox.pack_start (*menu_bar, true, true);
542         menu_hbox.pack_end (wall_clock_box, false, false, 10);
543         menu_hbox.pack_end (disk_space_box, false, false, 10);
544         menu_hbox.pack_end (cpu_load_box, false, false, 10);
545         menu_hbox.pack_end (buffer_load_box, false, false, 10);
546         menu_hbox.pack_end (sample_rate_box, false, false, 10);
547
548         menu_bar_base.set_name ("MainMenuBar");
549         menu_bar_base.add (menu_hbox);
550 }