112 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # encoding: utf-8 | ||
|  | """
 | ||
|  | Enable pyglet to be used interacive by setting PyOS_InputHook. | ||
|  | 
 | ||
|  | Authors | ||
|  | ------- | ||
|  | 
 | ||
|  | * Nicolas P. Rougier | ||
|  | * Fernando Perez | ||
|  | """
 | ||
|  | 
 | ||
|  | #----------------------------------------------------------------------------- | ||
|  | #  Copyright (C) 2008-2011  The yap_ipython Development Team | ||
|  | # | ||
|  | #  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 | ||
|  | 
 | ||
|  | #----------------------------------------------------------------------------- | ||
|  | # Platform-dependent imports and functions | ||
|  | #----------------------------------------------------------------------------- | ||
|  | 
 | ||
|  | if os.name == 'posix': | ||
|  |     import select | ||
|  | 
 | ||
|  |     def stdin_ready(): | ||
|  |         infds, outfds, erfds = select.select([sys.stdin],[],[],0) | ||
|  |         if infds: | ||
|  |             return True | ||
|  |         else: | ||
|  |             return False | ||
|  | 
 | ||
|  | elif sys.platform == 'win32': | ||
|  |     import msvcrt | ||
|  | 
 | ||
|  |     def stdin_ready(): | ||
|  |         return msvcrt.kbhit() | ||
|  | 
 | ||
|  | 
 | ||
|  | # 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 | ||
|  | #----------------------------------------------------------------------------- | ||
|  | 
 | ||
|  | def inputhook_pyglet(): | ||
|  |     """Run the pyglet event loop by processing pending events only.
 | ||
|  | 
 | ||
|  |     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 yap_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') | ||
|  |                 flip(window) | ||
|  | 
 | ||
|  |             # We need to sleep at this point to keep the idle CPU load | ||
|  |             # low.  However, if sleep to long, GUI response is poor.  As | ||
|  |             # 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 | ||
|  |             if used_time > 10.0: | ||
|  |                 # 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 |