[PATCH] Cygwin: console, pty: Prevent error in legacy console mode.

Brian Inglis Brian.Inglis@SystematicSw.ab.ca
Wed Nov 6 16:37:00 GMT 2019


On 2019-11-06 08:44, Takashi Yano wrote:
> On Wed, 6 Nov 2019 08:06:55 -0700
> Brian Inglis wrote:
>>> +      if (con.is_legacy)
>>> +	setenv ("TERM", "cygwin", 1);
>>>      }
>>
>> handlers should not be changing user's env vars: that is the user's selection to
>> get their preferred operation in their apps.
>>
>> If you need to set TERM, shouldn't you also set it appropriately for non-legacy
>> console?
> 
> The environment TERM is set to cygwin or xterm-256color in environ.cc
> based on wincap.has_con_24bit_colors().
> 
> However, if legacy console mode is enabled, new terminal capability
> compatible with xterm is disabled. So TERM is override to cygwin by
> the code above.
> 
> This is done only in the first initialization stage, so TERM value
> set by user in .login, .bashrc, .tcshrc and etc, ... will be kept.
> 
> Only the case in which TERM is overrid is:
> 1) Enable console legacy mode.
> 2) Open command prompt.
> 3) set TERMq
> 4) start cygwin
> 
> What situation do you assume this causes problem?

Is this not executed on every object creation and on every fork?
If that is not the case, then legacy_console/() should be a singleton
object/method, constructed when accessed, or in wincap, like
has_con_24bit_colors() - is_con_legacy().

When user explicitly sets TERM before starting Cygwin, or after forking, Cygwin
does not touch it, so you should not, and perhaps the legacy console check
should be added there:

newlib-cygwin/winsup/doc/setup-env.xml:
<para>
The <envar>TERM</envar> environment variable specifies your terminal
type.  It is automatically set to <literal>cygwin</literal> if you have
not set it to something else.
</para>

newlib-cygwin/winsup/cygwin/environ.cc:
   /* If console has 24 bit color capability, TERM=xterm-256color,
      otherwise, TERM=cygwin */
   if (!sawTERM)
-    envp[i++] = strdup (wincap.has_con_24bit_colors () ? xterm : cygterm);
+    envp[i++] = strdup (wincap.has_con_24bit_colors () &&
!wincap.is_con_legacy() ? xterm : cygterm);

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.



More information about the Cygwin-patches mailing list