Skip to content

SDL2 window created with SDL_WINDOW_FULLSCREEN_DESKTOP won't change display mode when changing to SDL_WINDOW_FULLSCREEN #11047

Open
@nmlgc

Description

@nmlgc

Tested at 643437f on Windows 11. A non-fullscreen window can switch into borderless and then exclusive fullscreen mode without issue:

#include <SDL.h>
#include <assert.h>

int main(void)
{
	int ret = 0;
	SDL_Init(SDL_INIT_VIDEO);
	SDL_CreateWindowAndRenderer(640, 480, 0, &window, &renderer);

	SDL_SetRenderDrawColor(renderer, 0, 0, 128, SDL_ALPHA_OPAQUE);
	SDL_RenderFillRect(renderer, NULL);
	SDL_RenderPresent(renderer);
	SDL_Delay(1000);

	ret = SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
	assert(ret == 0);
	SDL_SetRenderDrawColor(renderer, 128, 0, 0, SDL_ALPHA_OPAQUE);
	SDL_RenderFillRect(renderer, NULL);
	SDL_RenderPresent(renderer);
	SDL_Delay(1000);

	ret = SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);
	assert(ret == 0);
	SDL_SetRenderDrawColor(renderer, 0, 128, 0, SDL_ALPHA_OPAQUE);
	SDL_RenderFillRect(renderer, NULL);
	SDL_RenderPresent(renderer);
	SDL_Delay(5000);
	
	return 0;
}

If the window is created in borderless mode though, it stays locked to the desktop resolution and the switch to SDL_WINDOW_FULLSCREEN won't perform a display mode change:

#include <SDL.h>
#include <assert.h>

int main(void)
{
	int ret = 0;
	SDL_Window *window = NULL;
	SDL_Renderer *renderer = NULL;

	SDL_Init(SDL_INIT_VIDEO);
	SDL_CreateWindowAndRenderer(
		640, 480, SDL_WINDOW_FULLSCREEN_DESKTOP, &window, &renderer
	);

	SDL_SetRenderDrawColor(renderer, 0, 0, 128, SDL_ALPHA_OPAQUE);
	SDL_RenderFillRect(renderer, NULL);
	SDL_RenderPresent(renderer);
	SDL_Delay(1000);
	
	/// Even switching into windowed mode beforehand does not help.
	// SDL_SetWindowFullscreen(window, 0);
	// SDL_Delay(2000);

	ret = SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN); // ← has no effect?
	assert(ret == 0);

	SDL_SetRenderDrawColor(renderer, 128, 0, 0, SDL_ALPHA_OPAQUE);
	SDL_RenderFillRect(renderer, NULL);
	SDL_RenderPresent(renderer);

	SDL_Delay(1000);
	SDL_Quit();

	return 0;
}

The equivalent SDL 3 code also works without issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions