Quick answer: Save your windowed (w, h) before toggling fullscreen. On exit, call set_mode((w, h)) with stored values, not the desktop’s.

A game with F11 fullscreen toggle returns to a tiny default-size window after exit. toggle_fullscreen changed mode but didn’t remember the original.

Save and Restore

windowed_size = (1280, 720)
fullscreen = False

def toggle_fs():
    global fullscreen
    fullscreen = not fullscreen
    if fullscreen:
        pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
    else:
        pygame.display.set_mode(windowed_size, pygame.RESIZABLE)

(0, 0) with FULLSCREEN flag uses current desktop resolution. Returning to windowed uses stored size.

Track User Resize

for event in pygame.event.get():
    if event.type == pygame.VIDEORESIZE and not fullscreen:
        windowed_size = event.size

Persist resizes the user does so toggling fullscreen and back restores their last size.

Persist Across Sessions

def save_settings():
    with open("settings.json", "w") as f:
        json.dump({"size": windowed_size, "fs": fullscreen}, f)

Save on quit; load on startup. Players keep their preferred setup.

Verifying

Resize window. Press F11 — fullscreen. Press F11 again — restores to last resized size, not default.

“State the original explicitly; don’t trust toggle_fullscreen to remember.”

For Steam Deck (always fullscreen), skip the toggle UI entirely — check Deck environment via SDL_GetPlatform.