import os
import sys

## Windows-specific preconfiguration
#if os.name == 'nt' and sys.executable.endswith('python.exe'):
#    choice = 0
#    while choice not in (1, 2, 3):
#        print 'PRELOAD OPTION - WHICH VIDEO DRIVER WOULD YOU LIKE TO TRY?'
#        print '1. Let pygame decide'
#        print '2. windib'
#        print '3. directx'
#        try:
#            choice = int(raw_input('What is your choice?: '))
#        except ValueError:
#            pass
#
#    if choice == 2:
#        os.environ['SDL_VIDEODRIVER'] = 'windib'
#    elif choice == 3:
#        os.environ['SDL_VIDEODRIVER'] = 'directx'
#
#    del choice

# Initialize pygame
import pygame
pygame.init()
print 'pygame ' + pygame.ver
print 'SDL ' + '.'.join((str(i) for i in pygame.get_sdl_version()))

# Determine if a specific driver should be used for display
default_driver = os.environ.get('SDL_VIDEODRIVER', None)

def set_mode(size, centered, fullscreen, dblbuff, hardware, driver=default_driver):
    """This is an enhanced version of pygame.display.set_mode"""
    global red_box
    
    if centered:
        os.environ['SDL_VIDEO_CENTERED'] = '1'
    elif 'SDL_VIDEO_CENTERED' in os.environ:
        del os.environ['SDL_VIDEO_CENTERED']

    flags = 0
    if fullscreen:
        flags |= pygame.FULLSCREEN
    else:
        flags |= pygame.RESIZABLE

    if dblbuff:
        flags |= pygame.DOUBLEBUF

    if hardware:
        flags |= pygame.HWSURFACE

    if driver:
        os.environ['SDL_VIDEODRIVER'] = driver

    pygame.display.init()
    screen = pygame.display.set_mode(size, flags)
    screen_size = screen.get_size()
    pygame.display.set_caption('Display flags tester')
    red_box = pygame.Surface((screen_size[0] // 10, screen_size[1]))
    red_box.fill((255, 16, 32))
    return screen

# end set_mode

# Graphics setup
screen_size = default_screen_size = 800, 600
max_fps = 300
centered = True
fullscreen = False
dblbuff = True
hardware = False
screen = set_mode(screen_size, centered, fullscreen, dblbuff, hardware)
driver = default_driver = pygame.display.get_driver()
Font = pygame.font.Font(None, 24)
White = (255, 255, 255)

# Loop setup
Clock = pygame.time.Clock()
running = True
i = 0

# Loop
while running:

    for e in pygame.event.get():

        if e.type == pygame.KEYDOWN:

            # Press Esc to quit
            if e.key == pygame.K_ESCAPE:
                running = False

            # Press Enter to toggle between hardware
            # (full screen) and software mode
            elif e.key == pygame.K_RETURN:

                hardware = not hardware
                screen = set_mode(screen_size, centered, fullscreen,
                                  dblbuff, hardware, driver)

            # Press F1 to toggle between centered and not centered
            elif e.key == pygame.K_F1:

                centered = not centered
                if not fullscreen:
                    screen = set_mode(screen_size, centered, fullscreen,
                                      dblbuff, hardware, driver)

            # Press F2 to toggle between fullscreen and windowed
            elif e.key == pygame.K_F2:

                fullscreen = not fullscreen
                if fullscreen:
                    screen_size = 0, 0
                else:
                    screen_size = default_screen_size
                screen = set_mode(screen_size, centered, fullscreen,
                                  dblbuff, hardware, driver)
                screen_size = screen.get_size()

            # Press F3 to toggle between single-buffered and double-buffered
            elif e.key == pygame.K_F3:
                dblbuff = not dblbuff
                hardware = False                   
                screen = set_mode(screen_size, centered, fullscreen,
                                  dblbuff, hardware, driver)

            # Press F4 to toggle between drivers - I don't think that this
            # 
            elif e.key == pygame.K_F4:
                if os.name == 'nt':

                    if driver == 'directx':
                        driver = 'windib'
                    else:
                        driver = 'directx'

                pygame.display.quit()
                screen = set_mode(screen_size, centered, fullscreen,
                                  dblbuff, hardware, driver)
                driver = pygame.display.get_driver()

        # Handle resize event
        elif e.type == pygame.VIDEORESIZE:
            screen_size = e.size
            screen = set_mode(screen_size, centered, fullscreen,
                              dblbuff, hardware, driver)

        # Handle Alt+Tab by switching to windowed
        elif e.type == pygame.ACTIVEEVENT and e.state == 6 and e.gain == 0 \
             and hardware and os.name == 'nt':
            hardware = False                   
            screen = set_mode(screen_size, centered, fullscreen,
                              dblbuff, hardware, driver)

        # Handle quit event
        elif e.type == pygame.QUIT:
            running = False

    # Animate with brute force
    screen.fill((0, 0, 0))
    Size_Surf =     Font.render('    Size = ' + str(screen_size), 1, White)
    FPS_Surf =      Font.render('    FPS = %2.2f' % Clock.get_fps(), 1, White)
    Hardware_Surf = Font.render('CR: Hardware = ' + str(hardware), 1, White)
    Centered_Surf = Font.render('F1: Centered = ' + str(centered), 1, White)
    Fullscrn_Surf = Font.render('F2: Fullscreen = ' + str(fullscreen), 1, White)
    Dblbuff_Surf =  Font.render('F3: Double-buff = ' + str(dblbuff), 1, White)
    Driver_Surf =   Font.render('F4: Driver = ' + driver, 1, White)
    screen.blit(Size_Surf, (0, 0))
    screen.blit(FPS_Surf, (0, 32))
    screen.blit(Hardware_Surf, (0, 64))
    screen.blit(Centered_Surf, (0, 96))
    screen.blit(Fullscrn_Surf, (0, 128))
    screen.blit(Dblbuff_Surf, (0, 160))
    screen.blit(Driver_Surf, (0, 192))
    screen.blit(red_box, (i, 0))
    pygame.display.flip()

    if i < screen_size[0]:
        i += 1
    else:
        i = 0

    # Limit frames per second
    Clock.tick(max_fps)
