Terminal: Форма курсора возвращается к устаревшему стилю после того, как он скрыт, а затем снова станет видимым в окне консоли.

Созданный на 6 янв. 2020  ·  3Комментарии  ·  Источник: microsoft/terminal

Среда

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

Any other software? No

Действия по воспроизведению

После установки формы курсора в Properties->Terminal , скрытие и последующее отображение курсора путем установки Console.CursorVisible на false а затем true приводит к восстановлению формы курсора до устаревший стиль в хосте консоли.

Следующая простая программа на C # может показать проблему:

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
            }
        }
    }
}

Ожидаемое поведение

Установка Console.CursorVisible не должна изменять форму курсора.

Фактическое поведение

Форма курсора возвращается с Solid Box к устаревшему стилю ( Underline ):
linux

Связанные вопросы

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

Об этих двух проблемах сообщалось в контексте PowerShell + PSReadLine. PSReadLine зависит от Console.CursorVisible чтобы скрыть и показать курсор во время рендеринга, поэтому форма курсора возвращается.

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

Самый полезный комментарий

: tada: Эта проблема устранена в выпуске # 5251, который теперь успешно выпущен как Windows Terminal Preview v0.11.1121.0 .: tada:

Полезные ссылки:

Все 3 Комментарий

Ну черт возьми.

Как объяснено в # 409, проблема заключается в том, что вызов SetConsoleCursorInfo устанавливает размер курсора, а установка размера курсора заставляет форму курсора вернуться к унаследованному стилю (потому что это единственная форма, для которой размер применим AFAIK ).

Достаточно просто "исправить". Мы могли бы просто удалить эту строку из метода SetCursorInformation :
https://github.com/microsoft/terminal/blob/6f667f48ae109d4291cda1f8d4e977315c0dae8a/src/host/screenInfo.cpp#L1778

Но это изменение поведения общедоступного API, и вполне возможно, что некоторые приложения действительно могут полагаться на это поведение (хотя я думаю, что это маловероятно).

В идеале свойство Console.CursorVisible должно использовать API, который просто устанавливает видимость и ничего больше, но я не думаю, что такое существует. Лучшее, что вы могли бы сделать, - это использовать последовательность VT, но она, очевидно, не будет работать со старыми версиями Windows.

: tada: Эта проблема устранена в выпуске # 5251, который теперь успешно выпущен как Windows Terminal Preview v0.11.1121.0 .: tada:

Полезные ссылки:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги