globally remove all trailing whitespace from ardour code base.
[ardour.git] / gtk2_ardour / ardour_window.cc
1 /*
2     Copyright (C) 2002-2011 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 #include <iostream>
21 #include <sigc++/bind.h>
22
23 #include <gtkmm2ext/doi.h>
24
25 #include "ardour_window.h"
26 #include "ardour_ui.h"
27 #include "ui_config.h"
28 #include "keyboard.h"
29 #include "utils.h"
30
31 using namespace std;
32 using namespace Gtk;
33 using namespace Gtkmm2ext;
34 using namespace ARDOUR_UI_UTILS;
35
36 ArdourWindow::ArdourWindow (string title)
37         : Window ()
38         , VisibilityTracker (*((Gtk::Window*)this))
39 {
40         set_title (title);
41         init ();
42         set_position (Gtk::WIN_POS_CENTER);
43 }
44
45 ArdourWindow::ArdourWindow (Gtk::Window& parent, string /*title*/)
46         : Window ()
47         , VisibilityTracker (*((Gtk::Window*)this))
48 {
49         init ();
50         set_transient_for (parent);
51         set_position (Gtk::WIN_POS_CENTER_ON_PARENT);
52 }
53
54 ArdourWindow::~ArdourWindow ()
55 {
56         WM::Manager::instance().remove (proxy);
57 }
58
59 bool
60 ArdourWindow::on_key_press_event (GdkEventKey* ev)
61 {
62         bool handled = Gtk::Window::on_key_press_event (ev);
63
64         if (!handled) {
65                 if (!get_modal()) {
66                         handled = relay_key_press (ev, this);
67                 }
68         }
69
70         return handled;
71 }
72
73 bool
74 ArdourWindow::on_focus_in_event (GdkEventFocus *ev)
75 {
76         Keyboard::the_keyboard().focus_in_window (ev, this);
77         return Window::on_focus_in_event (ev);
78 }
79
80 bool
81 ArdourWindow::on_focus_out_event (GdkEventFocus *ev)
82 {
83         if (!get_modal()) {
84                 Keyboard::the_keyboard().focus_out_window (ev, this);
85         }
86         return Window::on_focus_out_event (ev);
87 }
88
89 void
90 ArdourWindow::on_unmap ()
91 {
92         Keyboard::the_keyboard().leave_window (0, this);
93         Window::on_unmap ();
94 }
95
96 bool
97 ArdourWindow::on_delete_event (GdkEventAny*)
98 {
99         return false;
100 }
101
102 void
103 ArdourWindow::init ()
104 {
105         set_border_width (10);
106         add_events (Gdk::FOCUS_CHANGE_MASK);
107
108       /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but
109            they should be considered part of the same "window level" as a dialog. This
110            works on X11 and Quartz, in that:
111
112            (a) utility & dialog windows are considered to be part of the same level
113            (b) they will float above normal windows without any particular effort
114            (c) present()-ing them will make a utility float over a dialog or
115                vice versa.
116         */
117
118         if (UIConfiguration::instance().get_all_floating_windows_are_dialogs()) {
119                 set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
120         } else {
121                 set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
122         }
123
124         Gtk::Window* parent = WM::Manager::instance().transient_parent();
125
126         if (parent) {
127                 set_transient_for (*parent);
128         }
129         
130         ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourWindow::hide));
131
132         proxy = new WM::ProxyTemporary (get_title(), this);
133         WM::Manager::instance().register_window (proxy);
134 }
135