Añadir color

Originariamente, muy pocas terminales aceptan el color, de manera que las versiones más antiguas de curses no lo aceptaban. Pero las implementaciones más modernas de curses y ncurses sí que aceptan el color. Desafortunadamente la pantalla básica originaria de curses ha influenciado al API, y curses usa el color con muchas restricciones, reflejando las pobres prestaciones de las primeras terminales a color.

Cada celda de caracteres de la pantalla se puede escribir en diferentes colores, encima de otros tantos colores de fondo. Por ejemplo podemos escribir un texto en verde sobre un fondo negro.

El método para aplicar el color que utiliza curses no es muy común, ya que el color de un carácter no se define por separado del fondo. Debemos definir el color del fondo y el de escritura como una pareja, denominada pareja de colores.

Antes de usar esta prestación de curses, debemos comprobar que la terminal actual acepta los colores y después iniciar las rutinas de color de curses. Para ello, usaremos una pareja de rutinas: has_colors y start_color.

color1

color2

Una vez que se ha llamado a start_color y que se inician  los colores, la variable COLOR_PAIR se configura con el número máximo de colores disponibles, que suele estar en torno ocho. Internamente, los números del 0 al 63 actúan como una ID única para cada uno de los colores disponibles.

Antes de que se puedan usar los colores como atributos, debe iniciar la pareja de colores que desea usar. Para hacerlo utilice la función init_pair. Mediante la función COLOR_PAIR podrá acceder a los atributos de color:

uso_del_color1

Normalmente, curses.h define algunos colores básicos, empezando con COLOR_. Otra función adicional, pair_content, permite la recuperación de la información de parejas de colores definida previamente.

Para definir que la pareja de color número 1 sea rojo sobre verde, debería usar:

ejemplo1

Después podrá acceder a esta pareja de colores como si fuese un atributo, usando COLOR_PAIR:

ejemplo2

De esta manera los futuros datos que aparezcan en la pantalla deberían ser rojos sobre fondo verde.

Como COLOR_PAIR es un atributo, puede combinarlo con otros atributos. En un Ordenador, normalmente se puede acceder a los colores de alta intensidad para la pantalla combinando el atributo COLOR_PAIR con el atributo tradicional A_BOLD, usando un OR a modo de bit de atributos:

ejemplo3

Vamos a comprobar cómo funcionan estas funciones escribiendo un ejemplo que llamaremos, color.c

Colores

  1. En primer lugar, compruebe si el programa de visualización de la terminal acepta colores, Si lo acepta, inicie el proceso de color:color_listado1
  2. Ahora ya puede usar el número de colores y de parejas de colores permitido. Cree siete parejas de colores y muéstrelas a la vezcolor_listado2

Este ejemplo genera por pantalla lo siguiente:

Captura de pantalla de 2014-06-13 13:23:27

Captura de pantalla de 2014-06-13 13:23:36

Redefinir los colores

Como herencia de tiempos pasados en los terminales sencillos se mostraban muy pocos colores a la vez, pero sí que permitían la configuración del conjunto de colores activos, curses permite redefinir el color con la función init_color:

redefinir colores

Esta función permite que se modifique un color existente (en el rango de 0 hasta COLORS) con nuevos valores de intensidad en el rango de 0 a 1000. Es algo así como definir los valores de colores para el formato de archivos de imágenes GIF.

Pads

Al trabajar con programas curses más avanzados, a veces resulta más sencillo crear una pantalla lógica y después enviar parte o la totalidad de la misma a pantalla física. De vez en cuando, también es mejor tener una pantalla lógica que sea realmente mayor que la física y mostrar únicamente parte de la pantalla lógica en un momento determinado.

Con las funciones curses que hemos visto hasta el momento puede resultar complicado, ya que ninguna ventana puede ser mayor que la pantalla física. curses proporciona una estructura de datos especial, pad, para manipular la información de la pantalla lógica que no se corresponde con una ventana normal.

Una estructura pad es muy similar a la estructura WINDOW, y todas las rutinas curses que escriben en las ventanas también se pueden usar con pad. Sin embargo, pad tiene sus propias rutinas para la creación y la actualización.

La estructura pad se crea igual que una ventana normal:

pad

Tenga en cuenta que el valor de retorno es un indicador de posición de una estructura WINDOW, el mismo que newwin. Las pad se eliminan con delwin, al igual que las ventanas.

pad dispone de diferentes rutinas para la actualización. Como una pad no está restringida a una ubicación en particular dentro de la pantalla, y la ubicación que debería ocupar en la pantalla. Estro lo haremos con la función prefresh:

pad2

separador

pad3

También dispone de una rutina suplementaria, pnourefresh. Actúa igual que wnoutrefresh, para las actualizaciones de pantalla más eficientes.

Uso de Pad

Vamos a crear un programa que llamaremos, pad.c para ver lo que hemos estudiado de este tema:

  1. Al principio de este programa, inicie la estructura pad y luego cree una pad que envíe un indicador de posición de dicha pad. Añada caracteres para completar la estructura pad (que tiene 50 caracteres de ancho y es más largo que el dispositivo de la terminal):uso_pad1
  2. Ahora, antes de salir, practique en la pantalla con diferentes áreas de la pad y en diferentes ubicaciones:uso_pad2

Cuando ejecutemos el programa i después de corregir los errores sintácticos deberíamos ver algo como esto:

Captura de pantalla de 2014-06-13 16:05:38

atras

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s