El control básico de entradas y salidas.

La pantalla

Como ya ha visto, todos los programas curses deben empezar con initscr y acabar con endwin. Estas son las definiciones de sus archivos de cabecera:

pantalla1A la función initscr sólo se la puede llamar una vez cada programa. La función initscr envía un indicador de la estructura sdtscr si tiene éxito. Si falla, simplemente muestra un mensaje de diagnóstico y error y hace que el programa salga.

La función endwin envía OK si tiene éxito y ERR si falla. Puede llamar a endwin para salir de curses y después puede reanudar la operación curses llamando a clearok (stdscr, 1) y refresh. De esta manera conseguirá que curses se olvide eficazmente de la apariencia de la pantalla física, forzándole a que ejecute una visualización totalmente distinta.

Salidas de pantallas

Existen varias funciones básicas para actualizar la pantalla:

salida_pantalla1curses tiene su propio tipo de carácter, chtype, que puede tener más bits que un char estándar. En la versión de Linux estándar de ncurses, chtype es realmente un typedef para unsigned long.

salida_pantalla2Las funciones add… añaden el carácter o cadena especificada en la ubicación actual.

salida_pantalla3La función printw formatea una cadena del mismo modo que printf y la añade a la ubicación actual.

salida_pantalla4La función refresh desencadena la actualización de la pantalla física, enviando OK si tiene éxito y ERR si sucede un error.

salida_pantalla5La función box le permite dibujar una caja alrededor de una ventana.

salida_pantalla6La función insch inserta un carácter, desplazando hacia la derecha los caracteres existentes, lo que ocurre al final de una línea no se especifica y depende de la terminal que está usando.

salida_pantalla7salida_pantalla_notainsertln inserta una línea en blanco, bajando en una posición las líneas existentes.

salida_pantalla8

Las dos funciones delete son análogos a las dos funciones insert.

salida_pantalla9Para producir un sonido, puede llamar a beep. Existe un pequeño grupo de terminales que no son capaces de emitir sonidos, por eso algunas configuraciones curses harán que la pantalla parpadee cuando se solicita a beep.

salida_pantalla10Si trabaja en una oficina con mucha gente, en la cual los pitidos pueden venir de cualquier máquina, posiblemente prefiera esta opción.

Tal como se puede imaginar, flash hace que la pantalla parpadee, pero si esto no es posible, intentará emitir un ruido en la terminal.

salida_pantalla11Leer la pantalla

Puede leer los caracteres de la pantalla, a pesar de que esta opción no se suele usar porque es más fácil seguir la pista de lo que se ha escrito. Si fuese necesario, puede hacerlo con las siguientes funciones:

leer_pantalla2La función inch debería estar disponible siempre, pero las funciones instr y innstr no siempre se aceptan. La función inch envía un carácter y la información sobre su atributo a partir de la ubicación actual del cursor en la pantalla. Tenga en cuenta que inch no envía un carácter, sino un chtype, mientras que instr e innstr escriben matrices de chars.

Vaciado de la pantalla

Existen cuatro modos principales para vaciar el área de la pantalla:

leer_pantallaLa función erase introduce espacios en blanco en todas las partes de la pantalla.

vaciado_pantalla1clearDicha función además hace una llamada interna a una función de bajo nivel, clearok, que cumple un a secuencia de borrado de pantalla y la vuelve a mostrar cuando se vuelve a llamar a refresh.

La función clear suele usar un comando de terminal que borra toda la pantalla, en vez de intentar borrar únicamente los espacios escritos que aparezcan en pantalla.  Esto hace que la función clear sea un modo fiable para vaciar por completo toda la pantalla.  La combinación de clear seguido de refresh puede proporcionar un comando de revisión muy útil si la pantalla está confusa o ha sido corrompido de alguna manera.

clrtoboot

Mover el Cursor

Para mover el cursor sólo existe una función, con un comando adicional para controlar dónde de curses el cursor tras las actualizaciones de pantalla:

mover_cursor

move

monitor1Recuerde que las coordenadas de la pantalla se especifican mediante (0,0) en la esquina superior izquierda de la pantalla.En la mayoría de versiones de curses, los dos enteros extern, LINES y COLUMNS, contienen el tamaño de la pantalla física y se pueden usar para determinar los máximos valores permitidos para new_y e new_x. La llamada a move no provocará, en sí misma, el movimiento del cursor físico. Sólo modifica la ubicación en la pantalla lógica en la que aparecerá la siguiente salida. Si desea que el cursor de la pantalla se mueva justo después de llamar a move, añada una llamada a refresh.

leaveokPor defecto, el indicador es false, y tras la actualización el cursor de hardware se deja en la misma posición de la pantalla que el cursor lógico. Si el indicador es true, el cursor de hardware se ubica aleatoriamente, en cualquier parte de la pantalla. Normalmente se refiere la opción predeterminada para asegurar que el cursor se sitúa en una ubicación sensata.

Atributos de carácter

Cada carácter puede tener ciertos atributos que controlan cómo se muestra en la pantalla, dando por hecho que el hardware del dispositivo acepta los dispositivos solicitados. Los atributos definidos son A_BLINK, A_DIM, A_REVERSE, A_STANDOUT y A_UNDERLINE. Puede usar estas funciones de configuración de atributos por separado o conjuntamente.

atributos_caracter

attrset

standout

Mover, insertar y atributos

Ahora que ya dispone de más información sobre cómo gestionar la pantalla, puede probar un ejemplo más complejo, moveadd.c. En este ejemplo, incluirá varias llamadas a refresh y a sleep, para que pueda comprobarla apariencia de la pantalla en cada etapa. Normalmente, los programas curses actualizan la pantalla siempre que se puede porque no es una operación muy eficiente.

  1. Empezamos incluyendo los archivos de cabecera necesarios, definimos también alguna matriz de caracteres y un indicador de posición de dichas matrices, y después iniciamos las estructuras curses:mover1
  2. Ahora para los conjuntos de texto iniciales que aparecen en intervalos en la pantalla, tenga en cuenta las señales on y off de los atributos del texto:move2
  3. Se identifica a los actores y se insertan sus nombres carácter por carácter:move3
  4. Por último, mueva el cursor hasta la esquina superior derecha de la pantalla, después colóquelo y salga:move4

Cuando ejecute este programa, la pantalla final será la misma que la de la figura de abajo.

mackbeth

Puede parecer que xterm es un modo más fiable que la consola raw para mostrar programas con toda exactitud.

Macbeth_xterm

Sería bueno para todos que aplicara cambios con el fin de familiarizarse con estas prácticas.

El teclado

A la vez que curses proporciona una interfaz para controlar la pantalla, también contiene un método fácil para controlar el teclado.

Modos de teclado

Las rutinas de lectura del teclado las controlan los modos. Las funciones que configuran a los modos son:

teclado_listado

modos_teclado

Las otras cuatro llamadas a funciones controlan cómo puede disponer el programa curses de los caracteres escritos en el terminal.

Para explicar cbreak, tiene que comprender el modo de entrada predeterminado. cuando un programa curses se inicia llamando a initscr, el modo de entrada se configura esgún el denominado modo cooked. esto significa que todo el procesamiento tiene lugar siguiendo una base línea a línea. Es decir, la entrada solo está disponible una vez que el usuario a presionado Intro (o la tecla Retorno en elgunos teclados). Se permiten los caracteres de teclado especiales, de manera que al escribir una secuencia de teclas adecuada podemos generar una señal en el programa. El control de flujo, si la terminal se está ejecutando desde una terminal, también esta permitido.

teclado1

Al igual que en el modo cooked, se permiten los caracteres de teclado especiales, pero las teclas sencillas, como el retroceso de espacio, se transmiten directamente al programa para ser procesadas, de manera que si desea que la tecla retroceso de espacio funcione según lo esperado, tiene que programarlas usted mismo.

teclado2

teclado3

teclado4

Entradas del teclado

Leer el teclado es muy sencillo. Las principales funciones son:

entradas_teclado

Actúan de un modo similar a sus equivalentes que no pertenecen a curses, getchar, gets y scanf. Tenga en cuenta que getstr proporciona un modo para limitar la longitud de la cadena enviada, de manera que debería usarla únicamente con mucha precaución. Si su versión de curses acepta getnstr, lo cual le permite limitar el número de caracteres leídos, úselo siempre antes que getstr.

Modos de teclado y entradas

 Veamos a continuación un programa de ejemplo, ipmode.c, que muestra como manejar el teclado.

  1. Configure el programa y las primeras llamadas curses:

    ipmove1

  2. Cuando el usuario introduce su contraseña, ha de detener la contraseña que se transmite mediante eco a la pantalla. Compruebe después la contraseña con zyzzy:

    ipmove2

  3. Finalmente, vuelva a permitir el eco del teclado y muestre el éxito o fallo:

    ipmove3

Cómo funciona

ipmove_explicacion1

ipmove_explicacion2

ipmove_explicacion3

ipmove_explicacion4

nota_curses

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