Patch from colinf to fix problems with toggle mixer on top (#2477).
[ardour.git] / gtk2_ardour / ardour_ui_dependents.cc
1 /*
2     Copyright (C) 2000 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 */
19
20 #ifdef WAF_BUILD
21 #include "gtk2ardour-config.h"
22 #endif
23
24 /* this file exists solely to break compilation dependencies that
25    would connect changes to the mixer or editor objects.
26 */
27
28 #include <cstdio>
29
30 #include "pbd/error.h"
31
32 #include "ardour/session.h"
33
34 #include "ardour_ui.h"
35 #include "public_editor.h"
36 #include "mixer_ui.h"
37 #include "keyboard.h"
38 #include "splash.h"
39 #include "route_params_ui.h"
40 #include "opts.h"
41 #include "i18n.h"
42
43 using namespace Gtk;
44 using namespace PBD;
45
46 namespace ARDOUR {
47         class Session;
48         class Route;
49 }
50
51 using namespace ARDOUR;
52
53 void
54 ARDOUR_UI::shutdown ()
55 {
56         if (ui_config->dirty()) {
57                 ui_config->save_state();
58         }
59 }
60
61 void
62 ARDOUR_UI::we_have_dependents ()
63 {
64         install_actions ();
65         ProcessorBox::register_actions ();
66         keyboard->setup_keybindings ();
67         editor->setup_tooltips ();
68         editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks));
69
70         editor->track_mixer_selection ();
71         mixer->track_editor_selection ();
72 }
73
74 void
75 ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s)
76 {
77         BootMessage (_("Setup Editor"));
78         editor->set_session (s);
79         BootMessage (_("Setup Mixer"));
80         mixer->set_session (s);
81
82         /* its safe to do this now */
83
84         BootMessage (_("Reload Session History"));
85         s->restore_history ("");
86 }
87
88 static bool
89 _hide_splash (gpointer arg)
90 {
91         ((ARDOUR_UI*)arg)->hide_splash();
92         return false;
93 }
94
95 void
96 ARDOUR_UI::goto_editor_window ()
97 {
98         if (splash && splash->is_visible()) {
99                 // in 2 seconds, hide the splash screen
100                 Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 2000);
101         }
102
103         editor->show_window ();
104         editor->present ();
105         flush_pending ();
106 }
107
108 void
109 ARDOUR_UI::goto_mixer_window ()
110 {
111         mixer->show_window ();
112         mixer->present ();
113         flush_pending ();
114 }
115
116 void
117 ARDOUR_UI::toggle_mixer_window ()
118 {
119         Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-mixer"));
120         if (!act) {
121                 return;
122         }
123
124         Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
125
126         if (tact->get_active()) {
127                 goto_mixer_window ();
128         } else {
129                 mixer->hide ();
130         }
131 }
132
133 void
134 ARDOUR_UI::toggle_mixer_on_top ()
135 {
136         /* Only called if the editor window received the shortcut key or if selected
137            from the editor window menu, so the mixer is definitely not on top, and
138            we can unconditionally make it so here.
139            
140            XXX this might not work so well where there is a global menu bar, e.g.
141            on OS X.
142         */
143
144         /* Toggle the mixer to `visible' if required */
145         Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-mixer"));
146         if (act) {
147                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
148
149                 if (!tact->get_active()) {
150                         tact->set_active (true);
151                 }
152         }
153         
154         goto_mixer_window ();
155 }
156
157 /** The main editor window has been closed */
158 gint
159 ARDOUR_UI::exit_on_main_window_close (GdkEventAny * /*ev*/)
160 {
161 #ifdef TOP_MENUBAR
162         /* just hide the window, and return - the top menu stays up */
163         editor->hide ();
164         return TRUE;
165 #else
166         /* time to get out of here */
167         finish();
168         return TRUE;
169 #endif
170 }
171