Pergunta

Este é um conto de dois scripts e está relacionada a um .

Os dois scripts estão em http://gist.github.com/50692 . O script ansi.rb exibe todas as 256 cores em todas as 256 cores do fundo. O script ncurses.rb exibe todas as 256 cores de primeiro plano mas o fundo exibe o básico 16 e, em seguida, parece percorrer vários atributos como piscar e vídeo inverso.

Então, o que dá? É este o bug em ncurses que ele usa um inteiro assinado de pares de cores? (Ie 'tput cores' diz 256, mas 'tput pares', diz 32767 em vez de 65536) Parece que se fosse esse o caso, a primeira metade dos pares de cores seria exibido corretamente, mas a segunda metade iria repetir ou entrar em atributos como o int wraps.

Foi útil?

Solução

A razão é porque ncurses pré ABI 6, que inclui a versão corrente que a maioria das distribuições incluindo Debian e utilização Amazon AMI, COLOR_PAIR(n) não pode fazer referência a qualquer pares definidos acima 256. Isto é porque o argumento para COLOR_PAIR(n) é do tipo cchar_t. Os 8 bits inferiores escolher o par de cores, e o resto são tratados como bitflags ORed por atributos terminais específicos. É por isso que você vê piscar, inversa, sublinhado, etc. quando você tenta ir além do par de número 255 em seu código de exemplo.

Isso é muito lamentável, e eu pretendo usar uma fila no meu programa para definir cores em tempo real usando init_pair() e apenas substituir os pares menos recentemente usado como um compromisso. Eu escrevi as ncurses mantenedor Thomas Dickey perguntando se existe uma maneira de sair de ncurses temporariamente para escrever códigos de terminais matérias e depois voltar para ncurses. Esta foi sua resposta:

Essencialmente, você teria que esquecer screen-otimização e apenas fazer o seu próprio desenho usando as funções listadas na terminfo (3), por exemplo, tigetstr, a mvcur, tputs.

Você pode sair temporariamente do ncurses, mas depois tem que pintar o tela. Caso contrário ncurses vai ser confundida sobre o que está na tela e onde está o cursor.

Esta solução parece apresentar muitas armadilhas, mas se você realmente precisa mais de 256 pares simultâneos em um programa ncurses (sem contar os pares que você poderia falso com o atributo inverso), então este é o que você terá que fazer.

Outras dicas

Eu não sei o Ruby em tudo, então não pode fornecer um exemplo de trabalho, mas o script ncurses.rb deve dizer-lhe algo em que é muito mais curto do que o script ansi.rb.

Você não está configurando as cores, por isso é apenas looping a paleta de cores padrão 16 com variações fornecidos pelo atributos como sublinhado piscar, negrito, etc.

Você precisa usar int init_color(short color, short r, short g, short b) para inicializar um índice de cor com os valores RGB (0 - 1000). E defina os pares de cores a ser usado para exibição com int init_pair(short pair, short f, short b) antes de chamar COLOR_PAIR(n)

Para portabilidade você deve verificar bool has_colors(void) e bool can_change_color(void)

No meu sistema as páginas man para ncurses são inestimáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top