inputhookpyglet.py
111 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
Nicolas Rougier
|
r4691 | # encoding: utf-8 | ||
""" | ||||
Enable pyglet to be used interacive by setting PyOS_InputHook. | ||||
Fernando Perez
|
r4804 | Authors | ||
------- | ||||
* Nicolas P. Rougier | ||||
* Fernando Perez | ||||
Nicolas Rougier
|
r4691 | """ | ||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Nicolas Rougier
|
r4691 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
import sys | ||||
import time | ||||
from timeit import default_timer as clock | ||||
import pyglet | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r4804 | # Platform-dependent imports and functions | ||
Nicolas Rougier
|
r4691 | #----------------------------------------------------------------------------- | ||
Fernando Perez
|
r4804 | if os.name == 'posix': | ||
import select | ||||
def stdin_ready(): | ||||
Nicolas Rougier
|
r4691 | infds, outfds, erfds = select.select([sys.stdin],[],[],0) | ||
if infds: | ||||
return True | ||||
else: | ||||
return False | ||||
Fernando Perez
|
r4804 | |||
elif sys.platform == 'win32': | ||||
import msvcrt | ||||
def stdin_ready(): | ||||
Nicolas Rougier
|
r4691 | return msvcrt.kbhit() | ||
Fernando Perez
|
r4804 | # On linux only, window.flip() has a bug that causes an AttributeError on | ||
# window close. For details, see: | ||||
# http://groups.google.com/group/pyglet-users/browse_thread/thread/47c1aab9aa4a3d23/c22f9e819826799e?#c22f9e819826799e | ||||
if sys.platform.startswith('linux'): | ||||
def flip(window): | ||||
try: | ||||
window.flip() | ||||
except AttributeError: | ||||
pass | ||||
else: | ||||
def flip(window): | ||||
window.flip() | ||||
#----------------------------------------------------------------------------- | ||||
# Code | ||||
#----------------------------------------------------------------------------- | ||||
Nicolas Rougier
|
r4691 | def inputhook_pyglet(): | ||
"""Run the pyglet event loop by processing pending events only. | ||||
Bernardo B. Marques
|
r4872 | |||
Nicolas Rougier
|
r4691 | This keeps processing pending events until stdin is ready. After | ||
processing all pending events, a call to time.sleep is inserted. This is | ||||
needed, otherwise, CPU usage is at 100%. This sleep time should be tuned | ||||
though for best performance. | ||||
""" | ||||
# We need to protect against a user pressing Control-C when IPython is | ||||
# idle and this is running. We trap KeyboardInterrupt and pass. | ||||
try: | ||||
t = clock() | ||||
while not stdin_ready(): | ||||
pyglet.clock.tick() | ||||
for window in pyglet.app.windows: | ||||
window.switch_to() | ||||
window.dispatch_events() | ||||
window.dispatch_event('on_draw') | ||||
Fernando Perez
|
r4804 | flip(window) | ||
Nicolas Rougier
|
r4691 | |||
# We need to sleep at this point to keep the idle CPU load | ||||
Bernardo B. Marques
|
r4872 | # low. However, if sleep to long, GUI response is poor. As | ||
Nicolas Rougier
|
r4691 | # a compromise, we watch how often GUI events are being processed | ||
# and switch between a short and long sleep time. Here are some | ||||
# stats useful in helping to tune this. | ||||
# time CPU load | ||||
# 0.001 13% | ||||
# 0.005 3% | ||||
# 0.01 1.5% | ||||
# 0.05 0.5% | ||||
used_time = clock() - t | ||||
Jonah Graham
|
r13125 | if used_time > 10.0: | ||
Nicolas Rougier
|
r4691 | # print 'Sleep for 1 s' # dbg | ||
time.sleep(1.0) | ||||
elif used_time > 0.1: | ||||
# Few GUI events coming in, so we can sleep longer | ||||
# print 'Sleep for 0.05 s' # dbg | ||||
time.sleep(0.05) | ||||
else: | ||||
# Many GUI events coming in, so sleep only very little | ||||
time.sleep(0.001) | ||||
except KeyboardInterrupt: | ||||
pass | ||||
return 0 | ||||