X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_window.cc;h=397860bb5e71578d57cc7a79de96bf1fb3528e11;hb=7598520fa6d3635449637c3377de3eb0f72278db;hp=6b325aca8534325d9f73fb96c52fdeb53e6a937d;hpb=23e7cf10191270d70357ccf0ed9294f020c7b7ab;p=ardour.git diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc index 6b325aca85..397860bb5e 100644 --- a/gtk2_ardour/ardour_window.cc +++ b/gtk2_ardour/ardour_window.cc @@ -24,6 +24,7 @@ #include "ardour_window.h" #include "ardour_ui.h" +#include "ui_config.h" #include "keyboard.h" #include "utils.h" @@ -58,21 +59,31 @@ ArdourWindow::~ArdourWindow () bool ArdourWindow::on_key_press_event (GdkEventKey* ev) { - return relay_key_press (ev, this); + 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_enter_notify_event (GdkEventCrossing *ev) +ArdourWindow::on_focus_in_event (GdkEventFocus *ev) { - Keyboard::the_keyboard().enter_window (ev, this); - return Window::on_enter_notify_event (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 @@ -92,18 +103,19 @@ 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: - + (a) utility & dialog windows are considered to be part of the same level (b) they will float above normal windows without any particular effort (c) present()-ing them will make a utility float over a dialog or vice versa. */ - if (ARDOUR_UI::instance()->config()->get_all_floating_windows_are_dialogs()) { + if (UIConfiguration::instance().get_all_floating_windows_are_dialogs()) { set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG); } else { set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY); @@ -114,7 +126,7 @@ ArdourWindow::init () if (parent) { set_transient_for (*parent); } - + ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourWindow::hide)); proxy = new WM::ProxyTemporary (get_title(), this);