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.