@@ -268,20 +268,65 @@ def nc_len(mystr):
268
268
_legal_terms_re = re .compile (
269
269
r"^(xterm|xterm-color|Eterm|aterm|rxvt|screen|kterm|rxvt-unicode|gnome|interix|tmux|st-256color|alacritty|konsole|foot)"
270
270
)
271
- _disable_xtermTitle = None
272
- _max_xtermTitle_len = 253
271
+ _xterm_title_supported = None
272
+ _max_xterm_title_len = 253
273
273
_title_init_seq = None
274
274
_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
275
320
276
321
277
322
def xtermTitle (mystr , raw = False ):
278
323
init_xterm_titles ()
279
324
280
- if dotitles and not _disable_xtermTitle :
325
+ if dotitles and _xterm_title_supported :
281
326
# If the title string is too big then the terminal can
282
327
# 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 ]
285
330
if not raw :
286
331
mystr = format_xterm_title (mystr )
287
332
@@ -294,18 +339,15 @@ def xtermTitle(mystr, raw=False):
294
339
f .flush ()
295
340
296
341
297
- default_xterm_title = None
298
-
299
-
300
342
def xtermTitleReset ():
301
343
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 :
304
346
prompt_command = os .environ .get ("PROMPT_COMMAND" )
305
347
if prompt_command == "" :
306
- default_xterm_title = ""
348
+ _default_xterm_title = ""
307
349
elif prompt_command is not None :
308
- if dotitles and not _disable_xtermTitle :
350
+ if dotitles and _xterm_title_supported :
309
351
from portage .process import find_binary , spawn
310
352
311
353
shell = os .environ .get ("SHELL" )
@@ -329,7 +371,7 @@ def xtermTitleReset():
329
371
home = os .environ .get ("HOME" , "" )
330
372
if home != "" and pwd .startswith (home ):
331
373
pwd = "~" + pwd [len (home ) :]
332
- default_xterm_title = format_xterm_title (
374
+ _default_xterm_title = format_xterm_title (
333
375
"{}@{}:{}" .format (
334
376
os .environ .get ("LOGNAME" , "" ),
335
377
os .environ .get ("HOSTNAME" , "" ).split ("." , 1 )[0 ],
@@ -338,7 +380,7 @@ def xtermTitleReset():
338
380
)
339
381
# since PROMPT_COMMAND can already contain escape sequences, output the
340
382
# title as a raw sequence without adding any additional sequences.
341
- xtermTitle (default_xterm_title , raw = True )
383
+ xtermTitle (_default_xterm_title , raw = True )
342
384
343
385
344
386
def notitles ():
@@ -518,50 +560,6 @@ def init_curses(fd):
518
560
return None
519
561
520
562
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
-
565
563
def get_term_size (fd = None ):
566
564
"""
567
565
Get the number of lines and columns of the tty that is connected to
0 commit comments