On 2020-11-25 10:31, Nikolai Zhubr via fpc-devel wrote:
25.11.2020 1:52, Tomas Hajny via fpc-devel:




Hi Nikolai,

No problem, thanks for testing. Unfortunately, it doesn't work for me
under Windows (Win 10 Pro 64-bit) either with the original version or

Have you also checked with this registry trick for win10:

[HKEY_CURRENT_USER\Console]
"VirtualTerminalLevel"=dword:00000001

(As per https://superuser.com/a/1300251/109090)
 .
 .

If I read the article correctly, it says that an application may enable this processing explicitly using SetConsoleMode, or that it may be enabled for all applications / consoles using the mentioned registry key. The code added to the compiler contains the mentioned SetConsoleMode setting, thus it should be sufficient according to the article. However, the call fails (here) with error 87 (invalid parameter). And btw, changing the registry key doesn't help (i.e. I still get the same error). The same call (SetConsoleMode) performed without setting the respective flag (ENABLE_VIRTUAL_TERMINAL_PROCESSING) succeeds. I'm willing to have a look at additional hints, but I won't perform additional research myself for this.

For anybody interested, the following test program reproduces the functionality in the compiler (and provides debug information):

-----------------------------
{$MODE OBJFPC}
uses
 Windows;
const
  ENABLE_VIRTUAL_TERMINAL_PROCESSING = $0004;
  CachedIsATTY : Boolean = false;
  IsATTYValue : Boolean = false;

function IsATTY(var t : text) : Boolean;
  const dwMode: dword = 0;
  begin
    if not(CachedIsATTY) then
      begin
        IsATTYValue := false;
        if GetConsoleMode(TextRec(t).handle, dwMode) then
        begin
          WriteLn ('dwMode = ', dwMode);
          if not (SetConsoleMode(TextRec(t).handle, dwMode)) then
           WriteLn ('SCM0: ', GetLastError);
          dwMode := dwMode or ENABLE_VIRTUAL_TERMINAL_PROCESSING;
          if SetConsoleMode(TextRec(t).handle, dwMode) then
            IsATTYValue := true
          else
           WriteLn ('SCM: ', GetLastError);
        end
         else
          WriteLn ('GCM: ', GetLastError);
        CachedIsATTY:=true;
      end;
    Result:=IsATTYValue;
  end;

begin
 WriteLn (IsATTY (Output));
end.
======================================

I get the following result (regardless from the registry setting):

dwMode = 3
SCM: 87
FALSE

Tomas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to