Deduplicate Window{Base}::create implementations

Co-authored-by: binary1248 <binary1248@hotmail.com>
This commit is contained in:
Chris Thrasher 2023-12-26 20:46:45 -06:00
parent f46c888e9b
commit a9d9ef6d83
3 changed files with 60 additions and 78 deletions

View File

@ -463,6 +463,18 @@ protected:
private:
friend class Window;
////////////////////////////////////////////////////////////
/// \brief Create (or recreate) the window
///
/// Implementation detail for sharing underlying implementation
/// with sf::Window
///
/// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window)
/// \param style %Window style, a bitwise OR combination of sf::Style enumerators
///
////////////////////////////////////////////////////////////
void create(VideoMode mode, std::uint32_t& style);
////////////////////////////////////////////////////////////
/// \brief Processes an event before it is sent to the user
///

View File

@ -74,45 +74,8 @@ void Window::create(VideoMode mode, const String& title, std::uint32_t style)
////////////////////////////////////////////////////////////
void Window::create(VideoMode mode, const String& title, std::uint32_t style, const ContextSettings& settings)
{
// Destroy the previous window implementation
close();
// Fullscreen style requires some tests
if (style & Style::Fullscreen)
{
// Make sure there's not already a fullscreen window (only one is allowed)
if (getFullscreenWindow())
{
err() << "Creating two fullscreen windows is not allowed, switching to windowed mode" << std::endl;
style &= ~static_cast<std::uint32_t>(Style::Fullscreen);
}
else
{
// Make sure that the chosen video mode is compatible
if (!mode.isValid())
{
err() << "The requested video mode is not available, switching to a valid mode" << std::endl;
assert(!VideoMode::getFullscreenModes().empty() && "No video modes available");
mode = VideoMode::getFullscreenModes()[0];
err() << " VideoMode: { size: { " << mode.size.x << ", " << mode.size.y
<< " }, bitsPerPixel: " << mode.bitsPerPixel << " }" << std::endl;
}
// Update the fullscreen window
setFullscreenWindow(this);
}
}
// Check validity of style according to the underlying platform
#if defined(SFML_SYSTEM_IOS) || defined(SFML_SYSTEM_ANDROID)
if (style & Style::Fullscreen)
style &= ~static_cast<std::uint32_t>(Style::Titlebar);
else
style |= Style::Titlebar;
#else
if ((style & Style::Close) || (style & Style::Resize))
style |= Style::Titlebar;
#endif
// Delegate to base class for creation logic
WindowBase::create(mode, style);
// Recreate the window implementation
m_impl = priv::WindowImpl::create(mode, title, style, settings);

View File

@ -78,45 +78,7 @@ WindowBase::~WindowBase()
////////////////////////////////////////////////////////////
void WindowBase::create(VideoMode mode, const String& title, std::uint32_t style)
{
// Destroy the previous window implementation
close();
// Fullscreen style requires some tests
if (style & Style::Fullscreen)
{
// Make sure there's not already a fullscreen window (only one is allowed)
if (getFullscreenWindow())
{
err() << "Creating two fullscreen windows is not allowed, switching to windowed mode" << std::endl;
style &= ~static_cast<std::uint32_t>(Style::Fullscreen);
}
else
{
// Make sure that the chosen video mode is compatible
if (!mode.isValid())
{
err() << "The requested video mode is not available, switching to a valid mode" << std::endl;
assert(!VideoMode::getFullscreenModes().empty() && "No video modes available");
mode = VideoMode::getFullscreenModes()[0];
err() << " VideoMode: { size: { " << mode.size.x << ", " << mode.size.y
<< " }, bitsPerPixel: " << mode.bitsPerPixel << " }" << std::endl;
}
// Update the fullscreen window
setFullscreenWindow(this);
}
}
// Check validity of style according to the underlying platform
#if defined(SFML_SYSTEM_IOS) || defined(SFML_SYSTEM_ANDROID)
if (style & Style::Fullscreen)
style &= ~static_cast<std::uint32_t>(Style::Titlebar);
else
style |= Style::Titlebar;
#else
if ((style & Style::Close) || (style & Style::Resize))
style |= Style::Titlebar;
#endif
WindowBase::create(mode, style);
// Recreate the window implementation
m_impl = priv::WindowImpl::create(mode, title, style, ContextSettings(0, 0, 0, 0, 0, 0xFFFFFFFF, false));
@ -384,6 +346,51 @@ void WindowBase::onResize()
}
////////////////////////////////////////////////////////////
void WindowBase::create(VideoMode mode, std::uint32_t& style)
{
// Destroy the previous window implementation
close();
// Fullscreen style requires some tests
if (style & Style::Fullscreen)
{
// Make sure there's not already a fullscreen window (only one is allowed)
if (getFullscreenWindow())
{
err() << "Creating two fullscreen windows is not allowed, switching to windowed mode" << std::endl;
style &= ~static_cast<std::uint32_t>(Style::Fullscreen);
}
else
{
// Make sure that the chosen video mode is compatible
if (!mode.isValid())
{
err() << "The requested video mode is not available, switching to a valid mode" << std::endl;
assert(!VideoMode::getFullscreenModes().empty() && "No video modes available");
mode = VideoMode::getFullscreenModes()[0];
err() << " VideoMode: { size: { " << mode.size.x << ", " << mode.size.y
<< " }, bitsPerPixel: " << mode.bitsPerPixel << " }" << std::endl;
}
// Update the fullscreen window
setFullscreenWindow(this);
}
}
// Check validity of style according to the underlying platform
#if defined(SFML_SYSTEM_IOS) || defined(SFML_SYSTEM_ANDROID)
if (style & Style::Fullscreen)
style &= ~static_cast<std::uint32_t>(Style::Titlebar);
else
style |= Style::Titlebar;
#else
if ((style & Style::Close) || (style & Style::Resize))
style |= Style::Titlebar;
#endif
}
////////////////////////////////////////////////////////////
void WindowBase::filterEvent(const Event& event)
{