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