Pregunta

Esta es una historia de dos scripts y está relacionada con una pregunta anterior .

Los dos scripts están en http://gist.github.com/50692 . El script ansi.rb muestra los 256 colores en los 256 colores de fondo. El script ncurses.rb muestra los 256 colores de primer plano, pero el fondo muestra los 16 básicos y luego parece alternar entre varios atributos como parpadeo y video inverso.

Entonces, ¿qué da? ¿Es este el error en ncurses de que usa un entero con signo para pares de colores? (es decir, 'colores de tput' dice 256 pero 'pares de tput' dice 32767 en lugar de 65536) Parece que si ese fuera el caso, la primera mitad de los pares de colores se mostraría correctamente pero la segunda mitad se repetiría o entraría en los atributos como int envolturas.

¿Fue útil?

Solución

La razón es porque ncurses pre ABI 6, que incluye la versión actual que utilizan la mayoría de las distribuciones, incluidas Debian y Amazon AMI, COLOR_PAIR (n) no puede hacer referencia a ningún par definido por encima de 256. Esto se debe a que el El argumento para COLOR_PAIR (n) es de tipo cchar_t . Los 8 bits inferiores eligen el par de colores, y el resto se trata como banderas de bits OR editadas para atributos terminales específicos. Es por eso que ve parpadeo, inverso, subrayado, etc. cuando intenta ir más allá del par número 255 en su código de muestra.

Esto es bastante desafortunado, y planeo usar una cola en mi programa para definir colores sobre la marcha usando init_pair () y simplemente sobrescribir los pares usados ??menos recientemente como un compromiso. Escribí al mantenedor de ncurses Thomas Dickey preguntando si hay una manera de salir temporalmente de ncurses para escribir códigos de terminal sin procesar y luego volver a ncurses. Esta fue su respuesta:

  

Esencialmente, deberías olvidarte de la optimización de pantalla y simplemente hacer   su propio dibujo utilizando las funciones enumeradas en terminfo (3), por ejemplo,   tigetstr, mvcur, tputs.

     

Puede salir temporalmente de ncurses, pero luego debe volver a pintar el   pantalla. De lo contrario, ncurses se confundirá sobre lo que está en la pantalla   y donde está el cursor.

Esta solución parece presentar demasiados problemas, pero si necesita absolutamente más de 256 pares simultáneos en un programa ncurses (sin contar los pares, podría fingir con el atributo inverso), entonces esto es lo que tendrá que hacer.

Otros consejos

No conozco a Ruby en absoluto, así que no puedo proporcionar un ejemplo de trabajo, pero el script ncurses.rb debería decirle algo que es mucho más corto que el script ansi.rb.

No está configurando los colores, por lo que solo está haciendo un bucle en la paleta de 16 colores predeterminada con variaciones proporcionadas por los atributos como subrayado de parpadeo, negrita, etc.

Debe usar int init_color (color corto, short r, short g, short b) para inicializar un índice de color con los valores RGB (0 - 1000) y luego establecer los pares de colores en use para mostrar con int init_pair (par corto, f corto, b corto) antes de llamar a COLOR_PAIR (n) .

Para la portabilidad, debe verificar bool has_colors (void) y bool can_change_color (void)

En mi sistema, las páginas man para ncurses son invaluables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top