diff --git a/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs b/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs index b4a0afa4d..c3179d1ff 100644 --- a/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs +++ b/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs @@ -218,7 +218,7 @@ namespace FlaxEditor.GUI.ContextMenu desc.AllowMaximize = false; desc.AllowDragAndDrop = false; desc.IsTopmost = true; - desc.IsRegularWindow = false; + desc.Type = WindowType.Utility; desc.HasSizingFrame = false; OnWindowCreating(ref desc); _window = Platform.CreateWindow(ref desc); diff --git a/Source/Editor/GUI/Docking/DockHintWindow.cs b/Source/Editor/GUI/Docking/DockHintWindow.cs index 9eec806ea..f7ca09d7c 100644 --- a/Source/Editor/GUI/Docking/DockHintWindow.cs +++ b/Source/Editor/GUI/Docking/DockHintWindow.cs @@ -441,7 +441,7 @@ namespace FlaxEditor.GUI.Docking settings.AllowMinimize = false; settings.HasBorder = false; settings.HasSizingFrame = false; - settings.IsRegularWindow = false; + settings.Type = WindowType.Utility; settings.SupportsTransparency = true; settings.ShowInTaskbar = false; settings.ShowAfterFirstPaint = false; @@ -473,7 +473,7 @@ namespace FlaxEditor.GUI.Docking settings.AllowMinimize = false; settings.HasBorder = false; settings.HasSizingFrame = false; - settings.IsRegularWindow = false; + settings.Type = WindowType.Utility; settings.SupportsTransparency = true; settings.ShowInTaskbar = false; settings.ActivateWhenFirstShown = false; diff --git a/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs b/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs index a1dc73068..3f5131680 100644 --- a/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs +++ b/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs @@ -82,7 +82,7 @@ namespace FlaxEditor.GUI.Docking settings.AllowMaximize = true; settings.AllowDragAndDrop = true; settings.IsTopmost = false; - settings.IsRegularWindow = true; + settings.Type = WindowType.Regular; settings.HasSizingFrame = true; settings.ShowAfterFirstPaint = false; settings.ShowInTaskbar = true; diff --git a/Source/Editor/Windows/SplashScreen.cpp b/Source/Editor/Windows/SplashScreen.cpp index 4ec761658..fecc5e724 100644 --- a/Source/Editor/Windows/SplashScreen.cpp +++ b/Source/Editor/Windows/SplashScreen.cpp @@ -165,7 +165,7 @@ void SplashScreen::Show() settings.AllowMaximize = false; settings.AllowDragAndDrop = false; settings.IsTopmost = false; - settings.IsRegularWindow = false; + settings.Type = WindowType::Utility; settings.HasSizingFrame = false; settings.ShowAfterFirstPaint = true; settings.StartPosition = WindowStartPosition::CenterScreen; diff --git a/Source/Engine/Platform/CreateWindowSettings.cs b/Source/Engine/Platform/CreateWindowSettings.cs index bcfbc7cf5..34dad6be5 100644 --- a/Source/Engine/Platform/CreateWindowSettings.cs +++ b/Source/Engine/Platform/CreateWindowSettings.cs @@ -21,7 +21,7 @@ namespace FlaxEngine AllowMinimize = true, AllowMaximize = true, AllowDragAndDrop = true, - IsRegularWindow = true, + Type = WindowType.Regular, HasSizingFrame = true, ShowAfterFirstPaint = true, }; diff --git a/Source/Engine/Platform/CreateWindowSettings.h b/Source/Engine/Platform/CreateWindowSettings.h index 2c2a15f1e..0e0e4ec0c 100644 --- a/Source/Engine/Platform/CreateWindowSettings.h +++ b/Source/Engine/Platform/CreateWindowSettings.h @@ -26,6 +26,32 @@ API_ENUM() enum class WindowStartPosition Manual, }; +/// +/// Specifies the type of the window. +/// +API_ENUM() enum class WindowType +{ + /// + /// Regular window. + /// + Regular, + + /// + /// Utility window. + /// + Utility, + + /// + /// Tooltip window. + /// + Tooltip, + + /// + /// Popup window. + /// + Popup, +}; + /// /// Settings for new window. /// @@ -119,9 +145,15 @@ DECLARE_SCRIPTING_TYPE_MINIMAL(CreateWindowSettings); API_FIELD() bool IsTopmost = false; /// - /// True if it's a regular window, false for tooltips, contextmenu and other utility windows. + /// True if it's a regular window, false for tooltips, context menu and other utility windows. /// - API_FIELD() bool IsRegularWindow = true; + API_FIELD() DEPRECATED bool IsRegularWindow = true; + + /// + /// The type of window. The type affects the behaviour of the window in system level. + /// Note: Tooltip and Popup windows require Parent to be set. + /// + API_FIELD() WindowType Type = WindowType::Regular; /// /// Enable/disable window sizing frame. diff --git a/Source/Engine/Platform/SDL/SDLWindow.cpp b/Source/Engine/Platform/SDL/SDLWindow.cpp index 00294724b..ed540325e 100644 --- a/Source/Engine/Platform/SDL/SDLWindow.cpp +++ b/Source/Engine/Platform/SDL/SDLWindow.cpp @@ -98,20 +98,45 @@ SDLWindow::SDLWindow(const CreateWindowSettings& settings) uint32 flags = 0; if (!_settings.HasBorder) flags |= SDL_WINDOW_BORDERLESS; - if (_settings.IsRegularWindow) + if (_settings.Type == WindowType::Regular) flags |= SDL_WINDOW_INPUT_FOCUS; + else if (_settings.Type == WindowType::Utility) + flags |= SDL_WINDOW_UTILITY; + else if (_settings.Type == WindowType::Tooltip) + flags |= SDL_WINDOW_TOOLTIP; + else if (_settings.Type == WindowType::Popup) + flags |= SDL_WINDOW_POPUP_MENU; if (!_settings.AllowInput) flags |= SDL_WINDOW_NOT_FOCUSABLE; - if (!_settings.ShowInTaskbar && _settings.IsRegularWindow) - flags |= SDL_WINDOW_UTILITY; + //if (!_settings.ShowInTaskbar && _settings.IsRegularWindow) + //flags |= SDL_WINDOW_UTILITY; if (_settings.ShowAfterFirstPaint) flags |= SDL_WINDOW_HIDDEN; if (_settings.HasSizingFrame) flags |= SDL_WINDOW_RESIZABLE; //flags |= SDL_WINDOW_HIGH_PIXEL_DENSITY; + if (_settings.Parent == nullptr && (_settings.Type == WindowType::Tooltip || _settings.Type == WindowType::Popup)) + { + // Creating a popup window on some platforms brings the parent window on top. + // Use the currently focused window as the parent instead to avoid losing focus of it + WindowsManager::WindowsLocker.Lock(); + for (auto win : WindowsManager::Windows) + { + if (win->IsFocused()) + { + _settings.Parent = win; + break; + } + } + WindowsManager::WindowsLocker.Unlock(); + + if (_settings.Parent == nullptr) + _settings.Parent = Engine::MainWindow; + } + // The SDL window position is always relative to the parent window if (_settings.Parent != nullptr) { @@ -671,7 +696,7 @@ void SDLWindow::Show() BringToFront(); // Reused top-most windows (DockHintWindow) doesn't stay on top for some reason - if (_settings.IsTopmost) + if (_settings.IsTopmost && _settings.Type != WindowType::Tooltip) SDL_SetWindowAlwaysOnTop(_window, SDL_TRUE); if (_isTrackingMouse) diff --git a/Source/Engine/Platform/Windows/WindowsWindow.cpp b/Source/Engine/Platform/Windows/WindowsWindow.cpp index 29f42e9a2..777da960f 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.cpp +++ b/Source/Engine/Platform/Windows/WindowsWindow.cpp @@ -111,7 +111,7 @@ WindowsWindow::WindowsWindow(const CreateWindowSettings& settings) if (settings.IsRegularWindow) style |= WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP; #elif WINDOWS_USE_NEWER_BORDER_LESS - if (settings.IsRegularWindow) + if (settings.Type == WindowType::Regular) style |= WS_THICKFRAME | WS_SYSMENU | WS_CAPTION; #endif exStyle |= WS_EX_WINDOWEDGE; @@ -155,7 +155,7 @@ WindowsWindow::WindowsWindow(const CreateWindowSettings& settings) #if WINDOWS_USE_NEWER_BORDER_LESS // Enable shadow - if (_settings.IsRegularWindow && !_settings.HasBorder && IsCompositionEnabled()) + if (settings.Type == WindowType::Regular && !_settings.HasBorder && IsCompositionEnabled()) { const int margin[4] = { 1, 1, 1, 1 }; ::DwmExtendFrameIntoClientArea(_handle, margin); @@ -288,7 +288,7 @@ void WindowsWindow::SetBorderless(bool isBorderless, bool maximized) if (_settings.IsRegularWindow) style |= WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP; #elif WINDOWS_USE_NEWER_BORDER_LESS - if (_settings.IsRegularWindow) + if (_settings.Type == WindowType::Regular) lStyle |= WS_THICKFRAME | WS_SYSMENU; #endif @@ -364,7 +364,7 @@ void WindowsWindow::BringToFront(bool force) { ASSERT(HasHWND()); - if (_settings.IsRegularWindow) + if (_settings.Type == WindowType::Regular) { if (IsIconic(_handle)) { diff --git a/Source/Engine/UI/GUI/Tooltip.cs b/Source/Engine/UI/GUI/Tooltip.cs index 3aa470347..282dc97f2 100644 --- a/Source/Engine/UI/GUI/Tooltip.cs +++ b/Source/Engine/UI/GUI/Tooltip.cs @@ -98,7 +98,7 @@ namespace FlaxEngine.GUI desc.AllowMaximize = false; desc.AllowDragAndDrop = false; desc.IsTopmost = true; - desc.IsRegularWindow = false; + desc.Type = WindowType.Tooltip; desc.HasSizingFrame = false; desc.ShowAfterFirstPaint = true; _window = Platform.CreateWindow(ref desc);