@@ -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,14 +371,14 @@ 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 ("{}@{}:{}" .format (
374
+ _default_xterm_title = format_xterm_title ("{}@{}:{}" .format (
333
375
os .environ .get ("LOGNAME" , "" ),
334
376
os .environ .get ("HOSTNAME" , "" ).split ("." , 1 )[0 ],
335
377
pwd ,
336
378
))
337
379
# since PROMPT_COMMAND can already contain escape sequences, output the
338
380
# title as a raw sequence without adding any additional sequences.
339
- xtermTitle (default_xterm_title , raw = True )
381
+ xtermTitle (_default_xterm_title , raw = True )
340
382
341
383
342
384
def notitles ():
@@ -516,50 +558,6 @@ def init_curses(fd):
516
558
return None
517
559
518
560
519
- def init_xterm_titles ():
520
- global _disable_xtermTitle
521
- global _title_init_seq
522
- global _title_finish_seq
523
-
524
- if _disable_xtermTitle is not None :
525
- # already initialized
526
- return
527
-
528
- _disable_xtermTitle = True
529
-
530
- if not sys .__stderr__ .isatty () or "TERM" not in os .environ :
531
- return
532
-
533
- try :
534
- # by default check if we can dynamically query the proper title
535
- # setting sequence via terminfo
536
- curses = init_curses (sys .stderr )
537
-
538
- if curses is not None :
539
- tsl = curses .tigetstr ("tsl" ).decode ()
540
- fsl = curses .tigetstr ("fsl" ).decode ()
541
- if tsl and fsl :
542
- _xtermTitle_supported = True
543
- _title_init_seq = tsl
544
- _title_finish_seq = fsl
545
- return
546
- except curses .error :
547
- pass
548
-
549
- if _legal_terms_re .match (os .environ ["TERM" ]) is not None :
550
- # as a fallback use the well known xterm escape sequences for the hard
551
- # coded suppoted terminal list
552
- _disable_xtermTitle = False
553
- _title_init_seq = "\x1b ]0;"
554
- _title_finish_seq = "\x07 "
555
-
556
-
557
- def format_xterm_title (mystr ):
558
- if _disable_xtermTitle :
559
- return mystr
560
- return _title_init_seq + mystr + _title_finish_seq
561
-
562
-
563
561
def get_term_size (fd = None ):
564
562
"""
565
563
Get the number of lines and columns of the tty that is connected to
0 commit comments