Terminal: La forme du curseur est rétablie au style hérité après avoir masqué le curseur, puis le rendre à nouveau visible dans la fenêtre de la console

Créé le 6 janv. 2020  ·  3Commentaires  ·  Source: microsoft/terminal

Environnement

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

Any other software? No

Étapes à suivre pour reproduire

Après avoir défini la forme du curseur dans Properties->Terminal , masquer puis afficher le curseur en définissant Console.CursorVisible sur false puis true provoque la restauration de la forme du curseur le style hérité dans l'hôte de la console.

Le programme C # simple suivant peut montrer le problème:

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

Comportement prévisible

Le réglage de Console.CursorVisible ne doit pas inverser la forme du curseur.

Comportement réel

La forme du curseur passe de Solid Box au style hérité ( Underline ):
linux

Problèmes liés

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

Ces 2 problèmes ont été signalés dans le contexte PowerShell + PSReadLine. PSReadLine dépend de Console.CursorVisible pour masquer et afficher le curseur pendant le rendu, de sorte que la forme du curseur est inversée.

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

Commentaire le plus utile

: tada: Ce problème a été résolu dans # 5251, qui a maintenant été publié avec succès sous le nom Windows Terminal Preview v0.11.1121.0 .: tada:

Liens utiles:

Tous les 3 commentaires

Eh bien, diable.

Comme expliqué dans # 409, le problème est que l'appel de SetConsoleCursorInfo définit la taille du curseur, et la définition de la taille du curseur force la forme du curseur à revenir au style hérité (car c'est la seule forme pour laquelle la taille est applicable AFAIK ).

C'est assez facile à «réparer». Nous pourrions simplement supprimer cette ligne de la méthode SetCursorInformation :
https://github.com/microsoft/terminal/blob/6f667f48ae109d4291cda1f8d4e977315c0dae8a/src/host/screenInfo.cpp#L1778

Mais c'est un changement de comportement pour une API publique, et il est possible que certaines applications s'appuient sur ce comportement (bien que je pense que cela est peu probable).

Idéalement, la propriété Console.CursorVisible devrait utiliser une API qui définit simplement la visibilité et rien d'autre, mais je ne pense pas qu'il existe une telle chose. Le mieux que vous puissiez faire est d'utiliser une séquence VT, mais cela ne fonctionnera évidemment pas avec les anciennes versions de Windows.

: tada: Ce problème a été résolu dans # 5251, qui a maintenant été publié avec succès sous le nom Windows Terminal Preview v0.11.1121.0 .: tada:

Liens utiles:

Cette page vous a été utile?
0 / 5 - 0 notes