##// END OF EJS Templates
First step in reintegrating Jedi...
First step in reintegrating Jedi If Jedi is installed expose a private API use it with prompt toolkit. Jedi does not _yet_ provide all the completion IPython has, so this is still a bit awkward. In order to debug this (and see what is Jedi provided we for now inject a fake Jedi/IPython delimiter in the menu. Jedi completion and this behavior are enabled by default, but could likely be opt-in. Add also a number of debug flags to be able to track why jedi is not working, and/or what completions are found by IPython and not Jedi. That should give us a bit of heads up and feedback to know whether we can remove part of the IPython completer, and more especially if we can drop `python_matches`. Once `python_matches` is dropped and some other of the current matchers are either dropped or converted to the new API, that should simplify the internal quite a bit. That would just be too much for an already BIG pull-request.

File last commit:

r13125:f9e20986
r23284:3ff1be2e
Show More
inputhookwx.py
167 lines | 5.9 KiB | text/x-python | PythonLexer
Brian Granger
First draft of full inputhook management.
r2066 # encoding: utf-8
"""
Enable wxPython to be used interacive by setting PyOS_InputHook.
Authors: Robin Dunn, Brian Granger, Ondrej Certik
"""
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
First draft of full inputhook management.
r2066 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Lessandro Mariano
Use inputhook_wx2 on osx...
r9543 import sys
Brian Granger
Work on inputhook....
r2208 import signal
Brian Granger
First draft of full inputhook management.
r2066 import time
from timeit import default_timer as clock
import wx
Christian Boos
inputhook: make stdin_ready() function reusable...
r4913 from IPython.lib.inputhook import stdin_ready
Brian Granger
First draft of full inputhook management.
r2066
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
def inputhook_wx1():
"""Run the wx event loop by processing pending events only.
Bernardo B. Marques
remove all trailling spaces
r4872
This approach seems to work, but its performance is not great as it
Brian Granger
First draft of full inputhook management.
r2066 relies on having PyOS_InputHook called regularly.
"""
Brian Granger
Work in the documentation.
r2345 try:
app = wx.GetApp()
if app is not None:
assert wx.Thread_IsMain()
# Make a temporary event loop and process system events until
# there are no more waiting, then allow idle events (which
# will also deal with pending or posted wx events.)
evtloop = wx.EventLoop()
ea = wx.EventLoopActivator(evtloop)
while evtloop.Pending():
evtloop.Dispatch()
app.ProcessIdle()
del ea
except KeyboardInterrupt:
pass
Brian Granger
First draft of full inputhook management.
r2066 return 0
class EventLoopTimer(wx.Timer):
def __init__(self, func):
self.func = func
wx.Timer.__init__(self)
def Notify(self):
self.func()
class EventLoopRunner(object):
def Run(self, time):
self.evtloop = wx.EventLoop()
self.timer = EventLoopTimer(self.check_stdin)
self.timer.Start(time)
self.evtloop.Run()
def check_stdin(self):
if stdin_ready():
self.timer.Stop()
self.evtloop.Exit()
def inputhook_wx2():
"""Run the wx event loop, polling for stdin.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
First draft of full inputhook management.
r2066 This version runs the wx eventloop for an undetermined amount of time,
during which it periodically checks to see if anything is ready on
stdin. If anything is ready on stdin, the event loop exits.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
First draft of full inputhook management.
r2066 The argument to elr.Run controls how often the event loop looks at stdin.
This determines the responsiveness at the keyboard. A setting of 1000
enables a user to type at most 1 char per second. I have found that a
Bernardo B. Marques
remove all trailling spaces
r4872 setting of 10 gives good keyboard response. We can shorten it further,
but eventually performance would suffer from calling select/kbhit too
Brian Granger
First draft of full inputhook management.
r2066 often.
"""
Brian Granger
Work in the documentation.
r2345 try:
app = wx.GetApp()
if app is not None:
assert wx.Thread_IsMain()
elr = EventLoopRunner()
# As this time is made shorter, keyboard response improves, but idle
# CPU load goes up. 10 ms seems like a good compromise.
elr.Run(time=10) # CHANGE time here to control polling interval
except KeyboardInterrupt:
pass
Brian Granger
First draft of full inputhook management.
r2066 return 0
def inputhook_wx3():
"""Run the wx event loop by processing pending events only.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
First draft of full inputhook management.
r2066 This is like inputhook_wx1, but it keeps processing pending events
Bernardo B. Marques
remove all trailling spaces
r4872 until stdin is ready. After processing all pending events, a call to
Brian Granger
First draft of full inputhook management.
r2066 time.sleep is inserted. This is needed, otherwise, CPU usage is at 100%.
This sleep time should be tuned though for best performance.
"""
Brian Granger
Work in the documentation.
r2345 # We need to protect against a user pressing Control-C when IPython is
# idle and this is running. We trap KeyboardInterrupt and pass.
try:
app = wx.GetApp()
if app is not None:
assert wx.Thread_IsMain()
# The import of wx on Linux sets the handler for signal.SIGINT
# to 0. This is a bug in wx or gtk. We fix by just setting it
# back to the Python default.
if not callable(signal.getsignal(signal.SIGINT)):
signal.signal(signal.SIGINT, signal.default_int_handler)
evtloop = wx.EventLoop()
ea = wx.EventLoopActivator(evtloop)
t = clock()
while not stdin_ready():
while evtloop.Pending():
t = clock()
evtloop.Dispatch()
app.ProcessIdle()
# We need to sleep at this point to keep the idle CPU load
Bernardo B. Marques
remove all trailling spaces
r4872 # low. However, if sleep to long, GUI response is poor. As
Brian Granger
Work in the documentation.
r2345 # 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
Remove 5s wait on inactivity on GUI inputhook loops...
r13125 if used_time > 10.0:
Brian Granger
Work in the documentation.
r2345 # 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)
del ea
except KeyboardInterrupt:
pass
Brian Granger
First draft of full inputhook management.
r2066 return 0
Lessandro Mariano
Use inputhook_wx2 on osx...
r9543 if sys.platform == 'darwin':
# On OSX, evtloop.Pending() always returns True, regardless of there being
# any events pending. As such we can't use implementations 1 or 3 of the
# inputhook as those depend on a pending/dispatch loop.
inputhook_wx = inputhook_wx2
else:
# This is our default implementation
inputhook_wx = inputhook_wx3