|
@@ -2634,6 +2634,66 @@ SDL_Window *SDL_CreatePopupWindow(SDL_Window *parent, int offset_x, int offset_y
|
|
return window;
|
|
return window;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool SDL_ReconfigureWindowInternal(SDL_Window *window, SDL_WindowFlags flags)
|
|
|
|
+{
|
|
|
|
+ bool loaded_opengl = false;
|
|
|
|
+ bool loaded_vulkan = false;
|
|
|
|
+
|
|
|
|
+ if (!_this->ReconfigureWindow) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Only attempt to reconfigure if the window has no existing graphics flags.
|
|
|
|
+ if (window->flags & (SDL_WINDOW_OPENGL | SDL_WINDOW_METAL | SDL_WINDOW_VULKAN)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const SDL_WindowFlags graphics_flags = flags & (SDL_WINDOW_OPENGL | SDL_WINDOW_METAL | SDL_WINDOW_VULKAN);
|
|
|
|
+ if (graphics_flags & (graphics_flags - 1)) {
|
|
|
|
+ return SDL_SetError("Conflicting window flags specified");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
|
|
|
|
+ return SDL_ContextNotSupported("OpenGL");
|
|
|
|
+ }
|
|
|
|
+ if ((flags & SDL_WINDOW_VULKAN) && !_this->Vulkan_CreateSurface) {
|
|
|
|
+ return SDL_ContextNotSupported("Vulkan");
|
|
|
|
+ }
|
|
|
|
+ if ((flags & SDL_WINDOW_METAL) && !_this->Metal_CreateView) {
|
|
|
|
+ return SDL_ContextNotSupported("Metal");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ SDL_DestroyWindowSurface(window);
|
|
|
|
+
|
|
|
|
+ if (graphics_flags & SDL_WINDOW_OPENGL) {
|
|
|
|
+ loaded_opengl = SDL_GL_LoadLibrary(NULL);
|
|
|
|
+ if (!loaded_opengl) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ } else if (graphics_flags & SDL_WINDOW_VULKAN) {
|
|
|
|
+ loaded_vulkan = SDL_GL_LoadLibrary(NULL);
|
|
|
|
+ if (!loaded_vulkan) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Try to reconfigure the window for the requested graphics flags.
|
|
|
|
+ if (!_this->ReconfigureWindow(_this, window, graphics_flags)) {
|
|
|
|
+ if (loaded_opengl) {
|
|
|
|
+ SDL_GL_UnloadLibrary();
|
|
|
|
+ }
|
|
|
|
+ if (loaded_vulkan) {
|
|
|
|
+ SDL_Vulkan_UnloadLibrary();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ window->flags |= graphics_flags;
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
bool SDL_RecreateWindow(SDL_Window *window, SDL_WindowFlags flags)
|
|
bool SDL_RecreateWindow(SDL_Window *window, SDL_WindowFlags flags)
|
|
{
|
|
{
|
|
bool loaded_opengl = false;
|
|
bool loaded_opengl = false;
|
|
@@ -2788,6 +2848,16 @@ bool SDL_RecreateWindow(SDL_Window *window, SDL_WindowFlags flags)
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool SDL_ReconfigureWindow(SDL_Window *window, SDL_WindowFlags flags)
|
|
|
|
+{
|
|
|
|
+ // Try to reconfigure the window for the desired flags first, before completely destroying and recreating it.
|
|
|
|
+ if (!SDL_ReconfigureWindowInternal(window, flags)) {
|
|
|
|
+ return SDL_RecreateWindow(window, flags);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
bool SDL_HasWindows(void)
|
|
bool SDL_HasWindows(void)
|
|
{
|
|
{
|
|
return _this && _this->windows;
|
|
return _this && _this->windows;
|