Skip to content

Commit 931c4d0

Browse files
committed
output.py: harmonize variable names and group xterm title code
The global variables are inconsistently named and spread over the module, similarly the title related code is not grouped together. Harmonize this. Also the double negative logic involving `_disable_xtermTitle` makes the code harder to read. Invert the logic. Signed-off-by: Matthias Gerstner <[email protected]>
1 parent 55bea1c commit 931c4d0

File tree

1 file changed

+56
-58
lines changed

1 file changed

+56
-58
lines changed

Diff for: lib/portage/output.py

+56-58
Original file line numberDiff line numberDiff line change
@@ -268,20 +268,65 @@ def nc_len(mystr):
268268
_legal_terms_re = re.compile(
269269
r"^(xterm|xterm-color|Eterm|aterm|rxvt|screen|kterm|rxvt-unicode|gnome|interix|tmux|st-256color|alacritty|konsole|foot)"
270270
)
271-
_disable_xtermTitle = None
272-
_max_xtermTitle_len = 253
271+
_xterm_title_supported = None
272+
_max_xterm_title_len = 253
273273
_title_init_seq = None
274274
_title_finish_seq = None
275+
_default_xterm_title = None
276+
277+
278+
def init_xterm_titles():
279+
global _xterm_title_supported
280+
global _title_init_seq
281+
global _title_finish_seq
282+
283+
if _xterm_title_supported is not None:
284+
# already initialized
285+
return
286+
287+
_xterm_title_supported = False
288+
289+
if not sys.__stderr__.isatty() or "TERM" not in os.environ:
290+
return
291+
292+
try:
293+
# by default check if we can dynamically query the proper title
294+
# setting sequence via terminfo
295+
curses = init_curses(sys.stderr)
296+
297+
if curses is not None:
298+
tsl = curses.tigetstr("tsl").decode()
299+
fsl = curses.tigetstr("fsl").decode()
300+
if tsl and fsl:
301+
_xterm_title_supported = True
302+
_title_init_seq = tsl
303+
_title_finish_seq = fsl
304+
return
305+
except curses.error:
306+
pass
307+
308+
if _legal_terms_re.match(os.environ["TERM"]) is not None:
309+
# as a fallback use the well known xterm escape sequences for the hard
310+
# coded suppoted terminal list
311+
_xterm_title_supported = True
312+
_title_init_seq = "\x1b]0;"
313+
_title_finish_seq = "\x07"
314+
315+
316+
def format_xterm_title(mystr):
317+
if not _xterm_title_supported:
318+
return mystr
319+
return _title_init_seq + mystr + _title_finish_seq
275320

276321

277322
def xtermTitle(mystr, raw=False):
278323
init_xterm_titles()
279324

280-
if dotitles and not _disable_xtermTitle:
325+
if dotitles and _xterm_title_supported:
281326
# If the title string is too big then the terminal can
282327
# misbehave. Therefore, truncate it if it's too big.
283-
if len(mystr) > _max_xtermTitle_len:
284-
mystr = mystr[:_max_xtermTitle_len]
328+
if len(mystr) > _max_xterm_title_len:
329+
mystr = mystr[:_max_xterm_title_len]
285330
if not raw:
286331
mystr = format_xterm_title(mystr)
287332

@@ -294,18 +339,15 @@ def xtermTitle(mystr, raw=False):
294339
f.flush()
295340

296341

297-
default_xterm_title = None
298-
299-
300342
def xtermTitleReset():
301343
init_xterm_titles()
302-
global default_xterm_title
303-
if default_xterm_title is None:
344+
global _default_xterm_title
345+
if _default_xterm_title is None:
304346
prompt_command = os.environ.get("PROMPT_COMMAND")
305347
if prompt_command == "":
306-
default_xterm_title = ""
348+
_default_xterm_title = ""
307349
elif prompt_command is not None:
308-
if dotitles and not _disable_xtermTitle:
350+
if dotitles and _xterm_title_supported:
309351
from portage.process import find_binary, spawn
310352

311353
shell = os.environ.get("SHELL")
@@ -329,7 +371,7 @@ def xtermTitleReset():
329371
home = os.environ.get("HOME", "")
330372
if home != "" and pwd.startswith(home):
331373
pwd = "~" + pwd[len(home) :]
332-
default_xterm_title = format_xterm_title(
374+
_default_xterm_title = format_xterm_title(
333375
"{}@{}:{}".format(
334376
os.environ.get("LOGNAME", ""),
335377
os.environ.get("HOSTNAME", "").split(".", 1)[0],
@@ -338,7 +380,7 @@ def xtermTitleReset():
338380
)
339381
# since PROMPT_COMMAND can already contain escape sequences, output the
340382
# title as a raw sequence without adding any additional sequences.
341-
xtermTitle(default_xterm_title, raw=True)
383+
xtermTitle(_default_xterm_title, raw=True)
342384

343385

344386
def notitles():
@@ -518,50 +560,6 @@ def init_curses(fd):
518560
return None
519561

520562

521-
def init_xterm_titles():
522-
global _disable_xtermTitle
523-
global _title_init_seq
524-
global _title_finish_seq
525-
526-
if _disable_xtermTitle is not None:
527-
# already initialized
528-
return
529-
530-
_disable_xtermTitle = True
531-
532-
if not sys.__stderr__.isatty() or "TERM" not in os.environ:
533-
return
534-
535-
try:
536-
# by default check if we can dynamically query the proper title
537-
# setting sequence via terminfo
538-
curses = init_curses(sys.stderr)
539-
540-
if curses is not None:
541-
tsl = curses.tigetstr("tsl").decode()
542-
fsl = curses.tigetstr("fsl").decode()
543-
if tsl and fsl:
544-
_xtermTitle_supported = True
545-
_title_init_seq = tsl
546-
_title_finish_seq = fsl
547-
return
548-
except curses.error:
549-
pass
550-
551-
if _legal_terms_re.match(os.environ["TERM"]) is not None:
552-
# as a fallback use the well known xterm escape sequences for the hard
553-
# coded suppoted terminal list
554-
_disable_xtermTitle = False
555-
_title_init_seq = "\x1b]0;"
556-
_title_finish_seq = "\x07"
557-
558-
559-
def format_xterm_title(mystr):
560-
if _disable_xtermTitle:
561-
return mystr
562-
return _title_init_seq + mystr + _title_finish_seq
563-
564-
565563
def get_term_size(fd=None):
566564
"""
567565
Get the number of lines and columns of the tty that is connected to

0 commit comments

Comments
 (0)