X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_window.cc;h=628999124fb7d62bc164f72dffccc01cb01fb3dc;hb=2e7e2d2658eb992993425204f76ae508d9d26ded;hp=94d3f55d128ec7230a6c60e3571e670789e05cdc;hpb=2b4d07e3042683ad3c2bd37f216aa724c2ffdc15;p=ardour.git diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc index 94d3f55d12..628999124f 100644 --- a/gtk2_ardour/ardour_window.cc +++ b/gtk2_ardour/ardour_window.cc @@ -23,43 +23,68 @@ #include #include "ardour_window.h" +#include "ardour_ui.h" +#include "ui_config.h" #include "keyboard.h" +#include "utils.h" using namespace std; using namespace Gtk; using namespace Gtkmm2ext; +using namespace ARDOUR_UI_UTILS; ArdourWindow::ArdourWindow (string title) : Window () + , VisibilityTracker (*((Gtk::Window*)this)) { set_title (title); init (); + set_position (Gtk::WIN_POS_MOUSE); } ArdourWindow::ArdourWindow (Gtk::Window& parent, string title) : Window () + , VisibilityTracker (*((Gtk::Window*)this)) { init (); + set_title (title); set_transient_for (parent); set_position (Gtk::WIN_POS_CENTER_ON_PARENT); } 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_leave_notify_event (GdkEventCrossing *ev) +ArdourWindow::on_focus_in_event (GdkEventFocus *ev) { - Keyboard::the_keyboard().leave_window (ev, this); - return Window::on_leave_notify_event (ev); + Keyboard::the_keyboard().focus_in_window (ev, this); + return Window::on_focus_in_event (ev); +} + +bool +ArdourWindow::on_focus_out_event (GdkEventFocus *ev) +{ + if (!get_modal()) { + Keyboard::the_keyboard().focus_out_window (ev, this); + } + return Window::on_focus_out_event (ev); } void @@ -69,8 +94,55 @@ 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 + they should be considered part of the same "window level" as a dialog. This + works on X11 in that: + + (a) there are no window "levels" + (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. + + Some X11 Window managers (e.g. KDE) get this wrong, and so we allow the user + to select what type of window hint is used. + + GTK+ on OS X uses different levels for DIALOG and UTILITY, and Cocoa has a bug/design + issue that it will not transfer keyboard focus across levels when hiding a window. + So on OS X, we use DIALOG for all ArdourWindows to ensure that keyboard focus + will return to the main window(s) when this window is hidden. + */ + +#ifdef __APPLE__ + set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG); +#else + 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); + } +#endif + + 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); } +