libsdl-org / SDL

Simple Directmedia Layer
https://libsdl.org
zlib License
9.81k stars 1.82k forks source link

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

Open nmlgc opened 3 weeks ago

nmlgc commented 3 weeks ago

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.

slouken commented 2 weeks ago

Sorry, I put this in the wrong milestone, but I highly recommend switching to SDL3 or using sdl2-compat if that's a possibility for you.