Terminal: A forma do cursor é revertida para o estilo legado após ocultar o cursor e torná-lo visível novamente na janela do console

Criado em 6 jan. 2020  ·  3Comentários  ·  Fonte: microsoft/terminal

Meio Ambiente

Windows build number: Microsoft Windows [Version 10.0.18363.535]
Windows Terminal version (if applicable): NA

Any other software? No

Passos para reproduzir

Depois de definir a forma do cursor em Properties->Terminal , ocultar e mostrar o cursor definindo Console.CursorVisible como false e então true faz com que a forma do cursor seja restaurada para o estilo legado no host do console.

O seguinte programa C # simples pode mostrar o problema:

using System;
using System.Text;

namespace cursorShape
{
    class Program
    {
        static void Main(string[] args)
        {
            const string prompt = "PROMP> ";
            StringBuilder sb = new StringBuilder();
            int top = Console.CursorTop;

            Console.OutputEncoding = Encoding.UTF8;
            Console.Write(prompt);

            while (true)
            {
                var key = Console.ReadKey();
                if (key.Key == ConsoleKey.Q)
                {
                    break;
                }

                sb.Append(key.KeyChar);

                Console.CursorVisible = false;   // Hide the cursor before rewriting
                Console.SetCursorPosition(0, top);
                Console.Write($"{prompt}{sb}");
                Console.SetCursorPosition(Console.CursorLeft, top);
                Console.CursorVisible = true;    // Show the cursor afterwards
            }
        }
    }
}

Comportamento esperado

Definir Console.CursorVisible não deve reverter a forma do cursor.

Comportamento real

A forma do cursor é revertida de Solid Box para o estilo legado ( Underline ):
linux

Assuntos relacionados

409 e # 1145 e https://github.com/PowerShell/PSReadLine/issues/903

Esses 2 problemas foram relatados no contexto do PowerShell + PSReadLine. PSReadLine depende de Console.CursorVisible para ocultar e mostrar o cursor durante a renderização, de forma que a forma do cursor seja revertida.

Area-Settings Issue-Bug Needs-Tag-Fix Product-Conhost Resolution-Fix-Committed

Comentários muito úteis

: tada: Este problema foi resolvido em # 5251, que agora foi lançado com sucesso como Windows Terminal Preview v0.11.1121.0 .: tada:

Links úteis:

Todos 3 comentários

Bem, que diabo.

Conforme explicado em # 409, o problema é que chamar SetConsoleCursorInfo define o tamanho do cursor, e definir o tamanho do cursor força a forma do cursor de volta ao estilo legado (porque essa é a única forma para a qual o tamanho é aplicável AFAIK )

É bastante fácil de "consertar". Poderíamos simplesmente deletar esta linha do método SetCursorInformation :
https://github.com/microsoft/terminal/blob/6f667f48ae109d4291cda1f8d4e977315c0dae8a/src/host/screenInfo.cpp#L1778

Mas isso é uma mudança no comportamento de uma API pública, e é possível que alguns aplicativos possam realmente depender desse comportamento (embora eu ache isso improvável).

Idealmente, a propriedade Console.CursorVisible deveria estar usando uma API que apenas define a visibilidade e nada mais, mas não acho que exista tal coisa. O melhor que você pode fazer é usar uma sequência VT, mas isso obviamente não funcionará com versões anteriores do Windows.

: tada: Este problema foi resolvido em # 5251, que agora foi lançado com sucesso como Windows Terminal Preview v0.11.1121.0 .: tada:

Links úteis:

Esta página foi útil?
0 / 5 - 0 avaliações