X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_window.cc;h=956b3608d486d7bab7091772b9f4f45bdd1b6ed9;hb=df28a71252f4593c65ec03611586dfc8a62a834f;hp=c15ca78c6baf8f77018d67fc6ad7a187bdd37500;hpb=c94d352f56270b6c93c66bcc3dc83cd49d5efccc;p=ardour.git diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc index c15ca78c6b..956b3608d4 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" @@ -38,45 +39,42 @@ ArdourWindow::ArdourWindow (string title) { set_title (title); init (); - set_position (Gtk::WIN_POS_CENTER); + set_position (Gtk::WIN_POS_MOUSE); } -ArdourWindow::ArdourWindow (Gtk::Window& parent, string /*title*/) +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); + // WM::Manager::instance().remove (proxy); } bool ArdourWindow::on_key_press_event (GdkEventKey* ev) { - if (get_modal()) { - return Gtk::Window::on_key_press_event (ev); - } + bool handled = Gtk::Window::on_key_press_event (ev); - if (!relay_key_press (ev, this)) { - return Gtk::Window::on_key_press_event (ev); + if (!handled) { + if (!get_modal()) { + handled = relay_key_press (ev, this); + } } - return true; + + return handled; } bool ArdourWindow::on_focus_in_event (GdkEventFocus *ev) { - if (Keyboard::some_magic_widget_has_focus()) { - Keyboard::magic_widget_drop_focus (); - } - Keyboard::the_keyboard().focus_in_window (ev, this); - Keyboard::magic_widget_grab_focus (); return Window::on_focus_in_event (ev); } @@ -84,7 +82,6 @@ bool ArdourWindow::on_focus_out_event (GdkEventFocus *ev) { if (!get_modal()) { - Keyboard::magic_widget_drop_focus (); Keyboard::the_keyboard().focus_out_window (ev, this); } return Window::on_focus_out_event (ev); @@ -93,16 +90,6 @@ ArdourWindow::on_focus_out_event (GdkEventFocus *ev) void ArdourWindow::on_unmap () { - if (Keyboard::some_magic_widget_has_focus()) { - Gtk::Widget* widget = get_focus(); - if (widget) { - Gtk::Window* win = static_cast(get_focus()->get_toplevel()); - if (win == Keyboard::get_current_window()) { - Keyboard::magic_widget_drop_focus (); - } - } - } - Keyboard::the_keyboard().leave_window (0, this); Window::on_unmap (); } @@ -119,31 +106,40 @@ 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 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 + /* 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. - */ + 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. - if (ARDOUR_UI::config()->get_all_floating_windows_are_dialogs()) { + 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); + ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourWindow::hide)); }