##// END OF EJS Templates
Only save the initial terminal title
Maciej Goszczycki -
Show More
@@ -1,129 +1,141 b''
1 1 # encoding: utf-8
2 2 """
3 3 Utilities for working with terminals.
4 4
5 5 Authors:
6 6
7 7 * Brian E. Granger
8 8 * Fernando Perez
9 9 * Alexander Belchenko (e-mail: bialix AT ukr.net)
10 10 """
11 11
12 12 # Copyright (c) IPython Development Team.
13 13 # Distributed under the terms of the Modified BSD License.
14 14
15 15 import os
16 16 import sys
17 17 import warnings
18 18 from shutil import get_terminal_size as _get_terminal_size
19 19
20 20 # This variable is part of the expected API of the module:
21 21 ignore_termtitle = True
22 22
23 23
24 24
25 25 if os.name == 'posix':
26 26 def _term_clear():
27 27 os.system('clear')
28 28 elif sys.platform == 'win32':
29 29 def _term_clear():
30 30 os.system('cls')
31 31 else:
32 32 def _term_clear():
33 33 pass
34 34
35 35
36 36
37 37 def toggle_set_term_title(val):
38 38 """Control whether set_term_title is active or not.
39 39
40 40 set_term_title() allows writing to the console titlebar. In embedded
41 41 widgets this can cause problems, so this call can be used to toggle it on
42 42 or off as needed.
43 43
44 44 The default state of the module is for the function to be disabled.
45 45
46 46 Parameters
47 47 ----------
48 48 val : bool
49 49 If True, set_term_title() actually writes to the terminal (using the
50 50 appropriate platform-specific module). If False, it is a no-op.
51 51 """
52 52 global ignore_termtitle
53 53 ignore_termtitle = not(val)
54 54
55 55
56 56 def _set_term_title(*args,**kw):
57 57 """Dummy no-op."""
58 58 pass
59 59
60 60
61 61 def _restore_term_title():
62 62 pass
63 63
64 64
65 _xterm_term_title_saved = False
66
67
65 68 def _set_term_title_xterm(title):
66 69 """ Change virtual terminal title in xterm-workalikes """
67 # save the current title to the xterm "stack"
68 sys.stdout.write('\033[22;0t')
70 global _xterm_term_title_saved
71 # Only save the title the first time we set, otherwise restore will only
72 # go back one title (probably undoing a %cd title change).
73 if not _xterm_term_title_saved:
74 # save the current title to the xterm "stack"
75 sys.stdout.write('\033[22;0t')
76 _xterm_term_title_saved = True
69 77 sys.stdout.write('\033]0;%s\007' % title)
70 78
71 79
72 80 def _restore_term_title_xterm():
81 # Make sure the restore has at least one accompanying set.
82 global _xterm_term_title_saved
83 assert _xterm_term_title_saved
73 84 sys.stdout.write('\033[23;0t')
85 _xterm_term_title_saved = False
74 86
75 87
76 88 if os.name == 'posix':
77 89 TERM = os.environ.get('TERM','')
78 90 if TERM.startswith('xterm'):
79 91 _set_term_title = _set_term_title_xterm
80 92 _restore_term_title = _restore_term_title_xterm
81 93 elif sys.platform == 'win32':
82 94 try:
83 95 import ctypes
84 96
85 97 SetConsoleTitleW = ctypes.windll.kernel32.SetConsoleTitleW
86 98 SetConsoleTitleW.argtypes = [ctypes.c_wchar_p]
87 99
88 100 def _set_term_title(title):
89 101 """Set terminal title using ctypes to access the Win32 APIs."""
90 102 SetConsoleTitleW(title)
91 103 except ImportError:
92 104 def _set_term_title(title):
93 105 """Set terminal title using the 'title' command."""
94 106 global ignore_termtitle
95 107
96 108 try:
97 109 # Cannot be on network share when issuing system commands
98 110 curr = os.getcwd()
99 111 os.chdir("C:")
100 112 ret = os.system("title " + title)
101 113 finally:
102 114 os.chdir(curr)
103 115 if ret:
104 116 # non-zero return code signals error, don't try again
105 117 ignore_termtitle = True
106 118
107 119
108 120 def set_term_title(title):
109 121 """Set terminal title using the necessary platform-dependent calls."""
110 122 if ignore_termtitle:
111 123 return
112 124 _set_term_title(title)
113 125
114 126
115 127 def restore_term_title():
116 128 """Restore, if possible, terminal title to the original state"""
117 129 if ignore_termtitle:
118 130 return
119 131 _restore_term_title()
120 132
121 133
122 134 def freeze_term_title():
123 135 warnings.warn("This function is deprecated, use toggle_set_term_title()")
124 136 global ignore_termtitle
125 137 ignore_termtitle = True
126 138
127 139
128 140 def get_terminal_size(defaultx=80, defaulty=25):
129 141 return _get_terminal_size((defaultx, defaulty))
General Comments 0
You need to be logged in to leave comments. Login now