Question

Ceci est un récit de deux scripts lié à une question précédente .

Les deux scripts se trouvent à l'adresse http://gist.github.com/50692 . Le script ansi.rb affiche les 256 couleurs sur les 256 couleurs d'arrière-plan. Le script ncurses.rb affiche les 256 couleurs de premier plan, mais l’arrière-plan affiche les valeurs de base 16, puis semble parcourir divers attributs tels que le clignotement et la vidéo inversée.

Alors qu'est-ce qui donne? Est-ce que c'est le bogue dans ncurses qu'il utilise un entier signé pour les paires de couleurs? (c'est-à-dire 'tput colors' dit 256 mais 'tput pairs' dit 32767 au lieu de 65536) Il semble que si c'était le cas, la première moitié des paires de couleurs s'afficherait correctement, mais la seconde moitié se répète ou entre dans les attributs tels que l'int wraps.

Était-ce utile?

La solution

La raison est parce que ncurses avant ABI 6, qui inclut la version actuelle utilisée par la plupart des distributions, y compris Debian et Amazon AMI, COLOR_PAIR (n) ne peut faire référence à aucune paire définie supérieure à 256. En effet, l'argument de COLOR_PAIR (n) est de type cchar_t . Les 8 bits inférieurs choisissent la paire de couleurs et les autres sont traités comme des balises binaires OU pour des attributs de terminal spécifiques. C’est pourquoi vous voyez clignoter, inverser, souligner, etc. lorsque vous essayez d’aller au-delà du numéro de paire 255 dans votre exemple de code.

C’est plutôt dommage, et j’envisage d’utiliser une file d’attente dans mon programme pour définir les couleurs à la volée à l’aide de init_pair () et d’écraser simplement les paires les moins récemment utilisées. J'ai écrit au responsable de ncurses Thomas Dickey pour lui demander s'il était possible de sortir temporairement de ncurses pour écrire des codes de terminal bruts, puis de revenir à ncurses. C'était sa réponse:

  

Essentiellement, il vous faudrait oublier l'optimisation de l'écran et juste faire   votre propre dessin en utilisant les fonctions listées dans terminfo (3), par exemple,   tigetstr, mvcur, tputs.

     

Vous pouvez quitter temporairement ncurses, mais vous devez ensuite repeindre le   écran. Sinon, les ncurses ne comprendront pas ce qui est affiché à l'écran   et où se trouve le curseur.

Cette solution semble présenter trop d’embûches, mais si vous avez absolument besoin de plus de 256 paires simultanées dans un programme ncurses (sans compter les paires, vous pouvez simuler avec l’attribut inverse), c’est ce que vous devrez faire.

Autres conseils

Je ne connais pas du tout Ruby, je ne peux donc pas donner d'exemple, mais le script ncurses.rb devrait vous dire quelque chose en ce sens qu'il est beaucoup plus court que le script ansi.rb.

Vous ne configurez pas les couleurs, il vous suffit donc de boucler la palette de 16 couleurs par défaut avec des variations fournies par des attributs tels que le soulignement, le gras, etc.

Vous devez utiliser int init_color (couleur courte, r court, g court, b court) pour initialiser un index de couleur avec les valeurs RVB (0 - 1000), puis définir les paires de couleurs sur à utiliser avec int init_pair (paire courte, f court, b court) avant d'appeler COLOR_PAIR (n) .

Pour des raisons de portabilité, vérifiez bool has_colors (void) et bool can_change_color (void)

Sur mon système, les pages de manuel relatives à ncurses sont inestimables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top