##// END OF EJS Templates
add patch
Talley Lambert -
Show More
@@ -1,56 +1,69 b''
1 import sys
1 import sys
2 import os
2 import os
3 from IPython.external.qt_for_kernel import QtCore, QtGui
3 from IPython.external.qt_for_kernel import QtCore, QtGui
4 from IPython import get_ipython
4
5
5 # If we create a QApplication, keep a reference to it so that it doesn't get
6 # If we create a QApplication, keep a reference to it so that it doesn't get
6 # garbage collected.
7 # garbage collected.
7 _appref = None
8 _appref = None
8 _already_warned = False
9 _already_warned = False
9
10
10
11
12 def _reclaim_excepthook():
13 shell = get_ipython()
14 if shell is not None:
15 sys.excepthook = shell.excepthook
16
17
11 def inputhook(context):
18 def inputhook(context):
12 global _appref
19 global _appref
13 app = QtCore.QCoreApplication.instance()
20 app = QtCore.QCoreApplication.instance()
14 if not app:
21 if not app:
15 if sys.platform == 'linux':
22 if sys.platform == "linux":
16 if not os.environ.get('DISPLAY') \
23 if not os.environ.get("DISPLAY") and not os.environ.get("WAYLAND_DISPLAY"):
17 and not os.environ.get('WAYLAND_DISPLAY'):
18 import warnings
24 import warnings
25
19 global _already_warned
26 global _already_warned
20 if not _already_warned:
27 if not _already_warned:
21 _already_warned = True
28 _already_warned = True
22 warnings.warn(
29 warnings.warn(
23 'The DISPLAY or WAYLAND_DISPLAY environment variable is '
30 "The DISPLAY or WAYLAND_DISPLAY environment variable is "
24 'not set or empty and Qt5 requires this environment '
31 "not set or empty and Qt5 requires this environment "
25 'variable. Deactivate Qt5 code.'
32 "variable. Deactivate Qt5 code."
26 )
33 )
27 return
34 return
28 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
35 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
29 _appref = app = QtGui.QApplication([" "])
36 _appref = app = QtGui.QApplication([" "])
37
38 # "reclaim" IPython sys.excepthook after event loop starts
39 # without this, it defaults back to BaseIPythonApplication.excepthook
40 # and exceptions in the Qt event loop are rendered without traceback
41 # formatting and look like "bug in IPython".
42 QtCore.QTimer.singleShot(0, _reclaim_excepthook)
43
30 event_loop = QtCore.QEventLoop(app)
44 event_loop = QtCore.QEventLoop(app)
31
45
32 if sys.platform == 'win32':
46 if sys.platform == "win32":
33 # The QSocketNotifier method doesn't appear to work on Windows.
47 # The QSocketNotifier method doesn't appear to work on Windows.
34 # Use polling instead.
48 # Use polling instead.
35 timer = QtCore.QTimer()
49 timer = QtCore.QTimer()
36 timer.timeout.connect(event_loop.quit)
50 timer.timeout.connect(event_loop.quit)
37 while not context.input_is_ready():
51 while not context.input_is_ready():
38 timer.start(50) # 50 ms
52 timer.start(50) # 50 ms
39 event_loop.exec_()
53 event_loop.exec_()
40 timer.stop()
54 timer.stop()
41 else:
55 else:
42 # On POSIX platforms, we can use a file descriptor to quit the event
56 # On POSIX platforms, we can use a file descriptor to quit the event
43 # loop when there is input ready to read.
57 # loop when there is input ready to read.
44 notifier = QtCore.QSocketNotifier(context.fileno(),
58 notifier = QtCore.QSocketNotifier(context.fileno(), QtCore.QSocketNotifier.Read)
45 QtCore.QSocketNotifier.Read)
46 try:
59 try:
47 # connect the callback we care about before we turn it on
60 # connect the callback we care about before we turn it on
48 # lambda is necessary as PyQT inspect the function signature to know
61 # lambda is necessary as PyQT inspect the function signature to know
49 # what arguments to pass to. See https://github.com/ipython/ipython/pull/12355
62 # what arguments to pass to. See https://github.com/ipython/ipython/pull/12355
50 notifier.activated.connect(lambda: event_loop.exit())
63 notifier.activated.connect(lambda: event_loop.exit())
51 notifier.setEnabled(True)
64 notifier.setEnabled(True)
52 # only start the event loop we are not already flipped
65 # only start the event loop we are not already flipped
53 if not context.input_is_ready():
66 if not context.input_is_ready():
54 event_loop.exec_()
67 event_loop.exec_()
55 finally:
68 finally:
56 notifier.setEnabled(False)
69 notifier.setEnabled(False)
General Comments 0
You need to be logged in to leave comments. Login now