diff --git a/examples/dockwidgets/main.cpp b/examples/dockwidgets/main.cpp index b9d84f23..15f5e9eb 100644 --- a/examples/dockwidgets/main.cpp +++ b/examples/dockwidgets/main.cpp @@ -147,17 +147,19 @@ int main(int argc, char **argv) MainWindowOptions options = MainWindowOption_None; auto flags = KDDockWidgets::Config::self().flags(); #if defined(DOCKS_DEVELOPER_MODE) + auto internalFlags = KDDockWidgets::Config::self().internalFlags(); + options = parser.isSet(centralFrame) ? MainWindowOption_HasCentralFrame : MainWindowOption_None; if (parser.isSet(noQtTool)) - flags |= KDDockWidgets::Config::Flag_internal_DontUseQtToolWindowsForFloatingWindows; + internalFlags |= KDDockWidgets::Config::InternalFlag_DontUseQtToolWindowsForFloatingWindows; if (parser.isSet(keepAbove)) flags |= KDDockWidgets::Config::Flag_KeepAboveIfNotUtilityWindow; if (parser.isSet(noParentForFloating)) - flags |= KDDockWidgets::Config::Flag_internal_DontUseParentForFloatingWindows; + internalFlags |= KDDockWidgets::Config::InternalFlag_DontUseParentForFloatingWindows; if (parser.isSet(nativeTitleBar)) flags |= KDDockWidgets::Config::Flag_NativeTitleBar; @@ -167,9 +169,9 @@ int main(int argc, char **argv) # if defined(Q_OS_WIN) if (parser.isSet(noAeroSnap)) - flags |= KDDockWidgets::Config::Flag_internal_NoAeroSnap; + internalFlags |= KDDockWidgets::Config::InternalFlag_NoAeroSnap; # endif - + Config::self().setInternalFlags(internalFlags); #endif if (parser.isSet(autoHideSupport)) diff --git a/examples/qtquick/dockwidgets/main.cpp b/examples/qtquick/dockwidgets/main.cpp index 085f12dc..443ad8f5 100644 --- a/examples/qtquick/dockwidgets/main.cpp +++ b/examples/qtquick/dockwidgets/main.cpp @@ -50,13 +50,14 @@ int main(int argc, char *argv[]) auto flags = KDDockWidgets::Config::self().flags(); #if defined(DOCKS_DEVELOPER_MODE) + auto internalFlags = KDDockWidgets::Config::self().internalFlags(); parser.process(app); if (parser.isSet(noQtTool)) - flags |= KDDockWidgets::Config::Flag_internal_DontUseQtToolWindowsForFloatingWindows; + internalFlags |= KDDockWidgets::Config::InternalFlag_DontUseQtToolWindowsForFloatingWindows; if (parser.isSet(noParentForFloating)) - flags |= KDDockWidgets::Config::Flag_internal_DontUseParentForFloatingWindows; + internalFlags |= KDDockWidgets::Config::InternalFlag_DontUseParentForFloatingWindows; if (parser.isSet(nativeTitleBar)) flags |= KDDockWidgets::Config::Flag_NativeTitleBar; @@ -65,9 +66,10 @@ int main(int argc, char *argv[]) # if defined(Q_OS_WIN) if (parser.isSet(noAeroSnap)) - flags |= KDDockWidgets::Config::Flag_internal_NoAeroSnap; + internalFlags |= KDDockWidgets::Config::InternalFlag_NoAeroSnap; # endif + KDDockWidgets::Config::self().setInternalFlags(internalFlags); #endif KDDockWidgets::Config::self().setFlags(flags); diff --git a/src/Config.cpp b/src/Config.cpp index 868c9799..f287c358 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -285,6 +285,11 @@ void Config::Private::fixFlags() m_flags = m_flags & ~Flag_AeroSnapWithClientDecos; } #endif + + if (m_flags & Flag_DontUseUtilityFloatingWindows) { + m_internalFlags |= InternalFlag_DontUseParentForFloatingWindows; + m_internalFlags |= InternalFlag_DontUseQtToolWindowsForFloatingWindows; + } } } diff --git a/src/Config.h b/src/Config.h index 1ba9db56..47248bfb 100644 --- a/src/Config.h +++ b/src/Config.h @@ -74,12 +74,7 @@ public: Flag_TitleBarHasMaximizeButton = 256, ///< The title bar will have a maximize/restore button when floating. This is mutually-exclusive with the floating button (since many apps behave that way). Flag_TitleBarIsFocusable = 512, ///< You can click the title bar and it will focus the last focused widget in the focus scope. If no previously focused widget then it focuses the user's dock widget guest, which should accept focus or use a focus proxy. Flag_LazyResize = 1024, ///< The dock widgets are resized in a lazy manner. The actual resize only happens when you release the mouse button. - - // These two are internal, for testing purposes across platforms. Use Flag_DontUseUtilityFloatingWindows instead. - Flag_internal_DontUseQtToolWindowsForFloatingWindows = 0x800, ///< FloatingWindows will use Qt::Window instead of Qt::Tool. Internal, use Flag_DontUseUtilityFloatingWindows instead. - Flag_internal_DontUseParentForFloatingWindows = 0x1000, ///< FloatingWindows won't have a parent top-level. Internal, use Flag_DontUseUtilityFloatingWindows instead. - - Flag_DontUseUtilityFloatingWindows = Flag_internal_DontUseQtToolWindowsForFloatingWindows | Flag_internal_DontUseParentForFloatingWindows, + Flag_DontUseUtilityFloatingWindows = 0x1000, Flag_TitleBarHasMinimizeButton = 0x2000 | Flag_DontUseUtilityFloatingWindows, ///< The title bar will have a minimize button when floating. This implies Flag_DontUseUtilityFloatingWindows too, otherwise they wouldn't appear in the task bar. Flag_TitleBarNoFloatButton = 0x4000, ///< The TitleBar won't show the float button Flag_AutoHideSupport = 0x8000 | Flag_TitleBarNoFloatButton, ///< Supports minimizing dock widgets to the side-bar. @@ -94,7 +89,9 @@ public: ///@warning Not for public consumption, support will be limited. enum InternalFlag { InternalFlag_None = 0, ///< The default - InternalFlag_NoAeroSnap = 1 ///< Only for development. Disables Aero-snap. + InternalFlag_NoAeroSnap = 1, ///< Only for development. Disables Aero-snap. + InternalFlag_DontUseParentForFloatingWindows = 2, ///< FloatingWindows won't have a parent top-level. + InternalFlag_DontUseQtToolWindowsForFloatingWindows = 4 ///< FloatingWindows will use Qt::Window instead of Qt::Tool. }; Q_DECLARE_FLAGS(InternalFlags, InternalFlag) diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 51354ad8..28757221 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -19,6 +19,7 @@ #include "SideBar_p.h" #include "WindowBeingDragged_p.h" #include "FloatingWindow_p.h" +#include "Utils_p.h" #include #include @@ -181,7 +182,7 @@ bool DockRegistry::isProbablyObscured(QWindow *window, FloatingWindow *exclude) } // Floating windows are Tool (keep above), unless we disabled it in Config - const bool targetIsToolWindow = !(Config::self().flags() & Config::Flag_DontUseUtilityFloatingWindows) && floatingWindowForHandle(window) != nullptr; + const bool targetIsToolWindow = KDDockWidgets::usesUtilityWindows() && floatingWindowForHandle(window) != nullptr; for (MainWindowBase *mw : m_mainWindows) { QWindow *mwWindow = mw->window()->windowHandle(); diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index ed69aaf5..c21e3fcc 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -86,7 +86,7 @@ static Qt::WindowFlags windowFlagsToUse() if (KDDockWidgets::usesNativeDraggingAndResizing()) return Qt::Window; - if (Config::self().flags() & Config::Flag_internal_DontUseQtToolWindowsForFloatingWindows) + if (Config::self().internalFlags() & Config::InternalFlag_DontUseQtToolWindowsForFloatingWindows) return Qt::Window; return Qt::Tool; @@ -94,7 +94,7 @@ static Qt::WindowFlags windowFlagsToUse() static MainWindowBase* hackFindParentHarder(Frame *frame, MainWindowBase *candidateParent) { - if (Config::self().flags() & Config::Flag_internal_DontUseParentForFloatingWindows) { + if (Config::self().flags() & Config::InternalFlag_DontUseParentForFloatingWindows) { return nullptr; } @@ -128,7 +128,7 @@ static MainWindowBase* hackFindParentHarder(Frame *frame, MainWindowBase *candid MainWindowBase *actualParent(MainWindowBase *candidate) { - return (Config::self().flags() & Config::Flag_internal_DontUseParentForFloatingWindows) + return (Config::self().flags() & Config::InternalFlag_DontUseParentForFloatingWindows) ? nullptr : candidate; } diff --git a/src/private/TitleBar.cpp b/src/private/TitleBar.cpp index 5050de96..c73237e7 100644 --- a/src/private/TitleBar.cpp +++ b/src/private/TitleBar.cpp @@ -370,7 +370,7 @@ void TitleBar::onMinimizeClicked() if (!m_floatingWindow) return; - if (!(Config::self().flags() & Config::Flag_DontUseUtilityFloatingWindows)) { + if (KDDockWidgets::usesUtilityWindows()) { // Qt::Tool windows don't appear in the task bar. // Unless someone tells me a good reason to allow this situation. return; diff --git a/src/private/Utils_p.h b/src/private/Utils_p.h index aa9cf967..cce55f73 100644 --- a/src/private/Utils_p.h +++ b/src/private/Utils_p.h @@ -99,6 +99,16 @@ inline bool usesNativeDraggingAndResizing() return usesNativeTitleBar() || usesAeroSnapWithCustomDecos(); } +inline bool usesUtilityWindows() +{ + const auto flags = Config::self().internalFlags(); + + const bool dontUse = (flags & Config::InternalFlag_DontUseParentForFloatingWindows) && + (flags & Config::InternalFlag_DontUseQtToolWindowsForFloatingWindows); + + return !dontUse; +} + inline bool usesFallbackMouseGrabber() { #ifdef KDDOCKWIDGETS_QTWIDGETS