# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

"""
Demonstration of how L{twisted.internet._threadedselect} might be used (this is
not an example showing the best way to integrate Twisted with pygame).
"""
# import Twisted and install
from twisted.internet import _threadedselect

_threadedselect.install()
import pygame
from pygame.locals import *

from twisted.internet import reactor

try:
    import pygame.fastevent as eventmodule
except ImportError:
    import pygame.event as eventmodule


# You can customize this if you use your
# own events, but you must OBEY:
#
#   USEREVENT <= TWISTEDEVENT < NUMEVENTS
#
TWISTEDEVENT = USEREVENT


def postTwistedEvent(func):
    # if not using pygame.fastevent, this can explode if the queue
    # fills up.. so that's bad.  Use pygame.fastevent, in pygame CVS
    # as of 2005-04-18.
    eventmodule.post(eventmodule.Event(TWISTEDEVENT, iterateTwisted=func))


def helloWorld():
    print("hello, world")
    reactor.callLater(1, helloWorld)


reactor.callLater(1, helloWorld)


def twoSecondsPassed():
    print("two seconds passed")


reactor.callLater(2, twoSecondsPassed)


def eventIterator():
    while True:
        yield eventmodule.wait()
        while True:
            event = eventmodule.poll()
            if event.type == NOEVENT:
                break
            else:
                yield event


def main():
    pygame.init()
    if hasattr(eventmodule, "init"):
        eventmodule.init()
    screen = pygame.display.set_mode((300, 300))

    # send an event when twisted wants attention
    reactor.interleave(postTwistedEvent)
    # make shouldQuit a True value when it's safe to quit
    # by appending a value to it.  This ensures that
    # Twisted gets to shut down properly.
    shouldQuit = []
    reactor.addSystemEventTrigger("after", "shutdown", shouldQuit.append, True)

    for event in eventIterator():
        if event.type == TWISTEDEVENT:
            event.iterateTwisted()
            if shouldQuit:
                break
        elif event.type == QUIT:
            reactor.stop()
        elif event.type == KEYDOWN and event.key == K_ESCAPE:
            reactor.stop()

    pygame.quit()


if __name__ == "__main__":
    main()
