Fix session-open after selecting new, template, then back
[ardour.git] / gtk2_ardour / ardour_window.cc
index 029f5f1c2382d0cc8c7aefc8176dd848c44f9342..ea89944d119cec431a99893d3feb0e61a7e4e478 100644 (file)
@@ -106,21 +106,33 @@ 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:
+       /* 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) utility & dialog windows are considered to be part of the same level
-           (b) they will float above normal windows without any particular effort
+          (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.
+
+          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();