##// END OF EJS Templates
Add inputhook for pyglet
Thomas Kluyver -
Show More
@@ -0,0 +1,68 b''
1 """Enable pyglet to be used interacively with prompt_toolkit
2 """
3 from __future__ import absolute_import
4
5 import os
6 import sys
7 import time
8 from timeit import default_timer as clock
9 import pyglet
10
11 # On linux only, window.flip() has a bug that causes an AttributeError on
12 # window close. For details, see:
13 # http://groups.google.com/group/pyglet-users/browse_thread/thread/47c1aab9aa4a3d23/c22f9e819826799e?#c22f9e819826799e
14
15 if sys.platform.startswith('linux'):
16 def flip(window):
17 try:
18 window.flip()
19 except AttributeError:
20 pass
21 else:
22 def flip(window):
23 window.flip()
24
25
26 def inputhook(context):
27 """Run the pyglet event loop by processing pending events only.
28
29 This keeps processing pending events until stdin is ready. After
30 processing all pending events, a call to time.sleep is inserted. This is
31 needed, otherwise, CPU usage is at 100%. This sleep time should be tuned
32 though for best performance.
33 """
34 # We need to protect against a user pressing Control-C when IPython is
35 # idle and this is running. We trap KeyboardInterrupt and pass.
36 try:
37 t = clock()
38 while not context.input_is_ready():
39 pyglet.clock.tick()
40 for window in pyglet.app.windows:
41 window.switch_to()
42 window.dispatch_events()
43 window.dispatch_event('on_draw')
44 flip(window)
45
46 # We need to sleep at this point to keep the idle CPU load
47 # low. However, if sleep to long, GUI response is poor. As
48 # a compromise, we watch how often GUI events are being processed
49 # and switch between a short and long sleep time. Here are some
50 # stats useful in helping to tune this.
51 # time CPU load
52 # 0.001 13%
53 # 0.005 3%
54 # 0.01 1.5%
55 # 0.05 0.5%
56 used_time = clock() - t
57 if used_time > 10.0:
58 # print 'Sleep for 1 s' # dbg
59 time.sleep(1.0)
60 elif used_time > 0.1:
61 # Few GUI events coming in, so we can sleep longer
62 # print 'Sleep for 0.05 s' # dbg
63 time.sleep(0.05)
64 else:
65 # Many GUI events coming in, so sleep only very little
66 time.sleep(0.001)
67 except KeyboardInterrupt:
68 pass
General Comments 0
You need to be logged in to leave comments. Login now