diff --git a/src/sdl2/i_video.c b/src/sdl2/i_video.c
index 97b9b6c20a7425f712429138ecd8eca0d6b97f5a..a46f4fde77f4914c2b0de13a0e2386b60e79d1f8 100644
--- a/src/sdl2/i_video.c
+++ b/src/sdl2/i_video.c
@@ -196,21 +196,35 @@ static void SDLSetMode(INT32 width, INT32 height, SDL_bool fullscreen)
 	realheight = (Uint16)height;
 #endif
 
+	static SDL_bool wasfullscreen = SDL_FALSE;
 	int rmask;
 	int gmask;
 	int bmask;
 	int amask;
 
-	if (fullscreen)
+	if (fullscreen && !wasfullscreen)
 	{
+		// Recreate window in fullscreen
 		SDL_DestroyRenderer(renderer);
 		renderer = NULL;
 		SDL_DestroyWindow(window);
 		window = NULL;
-		Impl_CreateWindow(fullscreen);
+		Impl_CreateWindow(SDL_TRUE);
+		wasfullscreen = SDL_TRUE;
 	}
-	else
+	else if (!fullscreen && wasfullscreen)
+	{
+		// Recreate window in windowed mode
+		SDL_DestroyRenderer(renderer);
+		renderer = NULL;
+		SDL_DestroyWindow(window);
+		window = NULL;
+		Impl_CreateWindow(SDL_FALSE);
+		wasfullscreen = SDL_FALSE;
+	}
+	else if (!wasfullscreen)
 	{
+		// Reposition window only in windowed mode
 		SDL_SetWindowSize(window, width, height);
 		SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
 	}