X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_window.cc;h=f6ced5fb492c7c7067fa0c6be4c97c9697a13a3f;hb=815ffcd567a65c259b31b41e03c56cf2fc8ad1b6;hp=3d09e59f7c7b509b89dfb647d2ad35e5de0c0947;hpb=074ef3c85951a015d62cff49965c775a1a8b8c15;p=ardour.git diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc index 3d09e59f7c..f6ced5fb49 100644 --- a/gtk2_ardour/ardour_window.cc +++ b/gtk2_ardour/ardour_window.cc @@ -30,6 +30,7 @@ using namespace std; using namespace Gtk; using namespace Gtkmm2ext; +using namespace ARDOUR_UI_UTILS; ArdourWindow::ArdourWindow (string title) : Window () @@ -37,7 +38,7 @@ ArdourWindow::ArdourWindow (string title) { set_title (title); init (); - set_position (Gtk::WIN_POS_MOUSE); + set_position (Gtk::WIN_POS_CENTER); } ArdourWindow::ArdourWindow (Gtk::Window& parent, string /*title*/) @@ -51,20 +52,37 @@ ArdourWindow::ArdourWindow (Gtk::Window& parent, string /*title*/) ArdourWindow::~ArdourWindow () { + WM::Manager::instance().remove (proxy); } bool -ArdourWindow::on_enter_notify_event (GdkEventCrossing *ev) +ArdourWindow::on_key_press_event (GdkEventKey* ev) { - Keyboard::the_keyboard().enter_window (ev, this); - return Window::on_enter_notify_event (ev); + bool handled = Gtk::Window::on_key_press_event (ev); + + if (!handled) { + if (!get_modal()) { + handled = relay_key_press (ev, this); + } + } + + return handled; +} + +bool +ArdourWindow::on_focus_in_event (GdkEventFocus *ev) +{ + Keyboard::the_keyboard().focus_in_window (ev, this); + return Window::on_focus_in_event (ev); } bool -ArdourWindow::on_leave_notify_event (GdkEventCrossing *ev) +ArdourWindow::on_focus_out_event (GdkEventFocus *ev) { - Keyboard::the_keyboard().leave_window (ev, this); - return Window::on_leave_notify_event (ev); + if (!get_modal()) { + Keyboard::the_keyboard().focus_out_window (ev, this); + } + return Window::on_focus_out_event (ev); } void @@ -74,12 +92,19 @@ ArdourWindow::on_unmap () Window::on_unmap (); } +bool +ArdourWindow::on_delete_event (GdkEventAny*) +{ + return false; +} + void ArdourWindow::init () { set_border_width (10); + add_events (Gdk::FOCUS_CHANGE_MASK); - /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but + /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but they should be considered part of the same "window level" as a dialog. This works on X11 and Quartz, in that: @@ -89,10 +114,21 @@ ArdourWindow::init () vice versa. */ - set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY); + if (ARDOUR_UI::config()->get_all_floating_windows_are_dialogs()) { + set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG); + } else { + set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY); + } - signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), this)); + Gtk::Window* parent = WM::Manager::instance().transient_parent(); + if (parent) { + set_transient_for (*parent); + } + ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourWindow::hide)); + + proxy = new WM::ProxyTemporary (get_title(), this); + WM::Manager::instance().register_window (proxy); }