diff --git a/IPython/terminal/interactiveshell.py b/IPython/terminal/interactiveshell.py index be738f8..eb49e67 100644 --- a/IPython/terminal/interactiveshell.py +++ b/IPython/terminal/interactiveshell.py @@ -8,7 +8,7 @@ from warnings import warn from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC from IPython.utils import io from IPython.utils.py3compat import input -from IPython.utils.terminal import toggle_set_term_title, set_term_title +from IPython.utils.terminal import toggle_set_term_title, set_term_title, restore_term_title from IPython.utils.process import abbrev_cwd from traitlets import ( Bool, Unicode, Dict, Integer, observe, Instance, Type, default, Enum, Union, @@ -238,6 +238,10 @@ class TerminalInteractiveShell(InteractiveShell): else: toggle_set_term_title(False) + def restore_term_title(self): + if self.term_title: + restore_term_title() + def init_display_formatter(self): super(TerminalInteractiveShell, self).init_display_formatter() # terminal only supports plain text @@ -507,6 +511,9 @@ class TerminalInteractiveShell(InteractiveShell): if hasattr(self, '_eventloop'): self._eventloop.stop() + self.restore_term_title() + + _inputhook = None def inputhook(self, context): if self._inputhook is not None: diff --git a/IPython/utils/terminal.py b/IPython/utils/terminal.py index 949275e..4e18002 100644 --- a/IPython/utils/terminal.py +++ b/IPython/utils/terminal.py @@ -58,14 +58,26 @@ def _set_term_title(*args,**kw): pass +def _restore_term_title(): + pass + + def _set_term_title_xterm(title): """ Change virtual terminal title in xterm-workalikes """ + # save the current title to the xterm "stack" + sys.stdout.write('\033[22;0t') sys.stdout.write('\033]0;%s\007' % title) + +def _restore_term_title_xterm(): + sys.stdout.write('\033[23;0t') + + if os.name == 'posix': TERM = os.environ.get('TERM','') if TERM.startswith('xterm'): _set_term_title = _set_term_title_xterm + _restore_term_title = _restore_term_title_xterm elif sys.platform == 'win32': try: import ctypes @@ -100,6 +112,13 @@ def set_term_title(title): _set_term_title(title) +def restore_term_title(): + """Restore, if possible, terminal title to the original state""" + if ignore_termtitle: + return + _restore_term_title() + + def freeze_term_title(): warnings.warn("This function is deprecated, use toggle_set_term_title()") global ignore_termtitle