diff options
author | Tor Norbye <tnorbye@google.com> | 2014-09-04 13:25:33 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2014-09-04 13:25:33 -0700 |
commit | d245f58efbfc26b13b9b9d5e52e6a83a0d76216c (patch) | |
tree | bca7d49005d81d10c70bc3f547df041c636b4300 /python/helpers/pydev/pydev_monkey_qt.py | |
parent | 9cde0e3c015174898df8b8f3672185941fad4786 (diff) | |
parent | c3d3a90f6b4ead083d63e28e6b9fcea93d675678 (diff) | |
download | idea-d245f58efbfc26b13b9b9d5e52e6a83a0d76216c.tar.gz |
Merge remote-tracking branch 'aosp/upstream-master' into merge
Diffstat (limited to 'python/helpers/pydev/pydev_monkey_qt.py')
-rw-r--r-- | python/helpers/pydev/pydev_monkey_qt.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/python/helpers/pydev/pydev_monkey_qt.py b/python/helpers/pydev/pydev_monkey_qt.py new file mode 100644 index 000000000000..9c62686173dd --- /dev/null +++ b/python/helpers/pydev/pydev_monkey_qt.py @@ -0,0 +1,89 @@ +from __future__ import nested_scopes + +def set_trace_in_qt(): + import pydevd_tracing + from pydevd_comm import GetGlobalDebugger + debugger = GetGlobalDebugger() + if debugger is not None: + pydevd_tracing.SetTrace(debugger.trace_dispatch) + + +_patched_qt = False +def patch_qt(): + ''' + This method patches qt (PySide or PyQt4) so that we have hooks to set the tracing for QThread. + ''' + + # Avoid patching more than once + global _patched_qt + if _patched_qt: + return + + _patched_qt = True + + try: + from PySide import QtCore + except: + try: + from PyQt4 import QtCore + except: + return + + _original_thread_init = QtCore.QThread.__init__ + _original_runnable_init = QtCore.QRunnable.__init__ + + + class FuncWrapper: + + def __init__(self, original): + self._original = original + + def __call__(self, *args, **kwargs): + set_trace_in_qt() + return self._original(*args, **kwargs) + + class StartedSignalWrapper: # Wrapper for the QThread.started signal + + def __init__(self, thread, original_started): + self.thread = thread + self.original_started = original_started + + def connect(self, func, *args, **kwargs): + return self.original_started.connect(FuncWrapper(func), *args, **kwargs) + + def disconnect(self, *args, **kwargs): + return self.original_started.disconnect(*args, **kwargs) + + def emit(self, *args, **kwargs): + return self.original_started.emit(*args, **kwargs) + + + class ThreadWrapper(QtCore.QThread): # Wrapper for QThread + + def __init__(self, *args, **kwargs): + _original_thread_init(self) + + self._original_run = self.run + self.run = self._new_run + self._original_started = self.started + self.started = StartedSignalWrapper(self, self.started) + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + class RunnableWrapper(QtCore.QRunnable): # Wrapper for QRunnable + + def __init__(self, *args, **kwargs): + _original_runnable_init(self) + + self._original_run = self.run + self.run = self._new_run + + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + QtCore.QThread = ThreadWrapper + QtCore.QRunnable = RunnableWrapper |