Visión general de los terminales con maldiciones

Las prestaciones del programa están limitadas, en parte, por las prestaciones del terminal en el que se ejecuta.

Esta sección proporciona información sobre la inicialización de terminales y la identificación de sus prestaciones.

Manipulación de varios terminales

Con curses, puede utilizar uno o más terminales para entrada y salida. Las subrutinas de terminal le permiten establecer nuevos terminales, conmutar el proceso de entrada y salida y recuperar prestaciones de terminal.

Puede iniciar curses en una única pantalla predeterminada utilizando la subrutina initscr . Si la aplicación envía la salida a más de un terminal, utilice la subrutina newterm . Llame a la subrutina newterm para cada terminal. Utilice también la subrutina newterm si la aplicación desea una indicación de las condiciones de error para que pueda continuar ejecutándose en una modalidad orientada a línea si el terminal no puede soportar un programa orientado a pantalla.

Cuando se completa, un programa debe llamar a la subrutina endwin para cada terminal que utilice. Si llama a la subrutina newterm más de una vez para el mismo terminal, el primer terminal al que se hace referencia debe ser el último para el que llama a la subrutina endwin .

La subrutina set_term conmuta el proceso de entrada y salida entre distintos terminales.

Determinación de prestaciones de terminal

Curses proporciona las subrutinas siguientes para ayudarle a determinar las prestaciones de un terminal:
Subrutina Descripción
has_ic Determina si un terminal tiene la capacidad de insertar caracteres
has_il Determina si un terminal tiene la posibilidad de insertar línea
nombre largo Devuelve el nombre detallado del terminal

La subrutina longname devuelve un puntero a un área estática que contiene una descripción detallada del terminal actual. Esta área estática sólo se define después de una llamada a la subrutina initscr o newterm . Si tiene previsto utilizar la subrutina longname con varios terminales, cada llamada a la subrutina newterm sobrescribe esta área. Las llamadas a la subrutina set_term no restauran el valor. En su lugar, guarde esta área entre llamadas a la subrutina newterm .

La subrutina has_ic devuelve TRUE si el terminal tiene prestaciones de inserción y supresión de caracteres.

La subrutina has_il devuelve TRUE si el terminal tiene prestaciones de línea de inserción y supresión o puede simular las prestaciones utilizando regiones de desplazamiento. Utilice la subrutina has_il para comprobar si es adecuado activar el desplazamiento físico utilizando las subrutinas scrollok o idlok .

Establecimiento de modalidades de entrada y salida de terminal

Las subrutinas que controlan la entrada y salida determinan cómo la aplicación recupera y muestra los datos a los usuarios.

Modos de entrada

Los caracteres de entrada especiales incluyen los caracteres de control de flujo, el carácter de interrupción, el carácter de borrado y el carácter de terminación. Las siguientes modalidades de maldiciones mutuamente excluyentes permiten que la aplicación controle el efecto de los caracteres de entrada:

Modo cocido
Esta modalidad logra un proceso normal de línea a la vez con todos los caracteres especiales manejados fuera de la aplicación, logrando el mismo efecto que el proceso de entrada de modalidad canónica. El estado de los distintivos ISIG e IXON no se cambia al entrar en esta modalidad llamando a nocbreak () y se establecen al entrar en este modo llamando a noraw ().

La implementación admite borrar y matar caracteres de cualquier entorno local soportado, independientemente de la anchura del carácter.

modalidad cbreak
Los caracteres tecleados por el usuario están inmediatamente disponibles para la aplicación y las maldiciones no realizan un proceso especial sobre el carácter de borrado o el carácter de terminación. Una aplicación puede seleccionar la modalidad cbreak para realizar su propia edición de línea, pero para permitir que se utilice el carácter de terminación anormal para terminar anormalmente la tarea. Esta modalidad logra el mismo efecto que la modalidad no canónica, el proceso de entrada de Caso B (con MIN establecido en 1 e ICRNL borrado). El estado de los distintivos ISIG e IXON no se cambia al entrar en esta modalidad.
Modalidad de retardo medio
El efecto es el mismo que cbreak, excepto que las funciones de entrada esperan hasta que haya un carácter disponible o que transcurra un intervalo definido por la aplicación, lo que ocurra primero. Esta modalidad logra el mismo efecto que la modalidad no canónica, el proceso de entrada de Caso C (con TIME establecido en el valor especificado por la aplicación). El estado de los distintivos ISIG e IXON no se cambia al entrar en esta modalidad.
Modalidad sin formato
La modalidad en bruto proporciona el máximo control a la aplicación sobre la entrada de terminal. La aplicación ve cada carácter a medida que se escribe. Esto consigue el mismo efecto que la modalidad no canónica, el proceso de entrada de Caso D. Los distintivos ISIG e IXON se borran al entrar en esta modalidad.

Los valores de la interfaz de terminal se registran cuando el proceso llama a las subrutinas initscr o newterm para inicializar curses y restaura estos valores cuando se llama a la subrutina endwin . La modalidad de entrada inicial para las operaciones de curses no se especifica a menos que la implementación dé soporte a la conformidad de curses mejorada, en la que la modalidad de entrada inicial es la modalidad cbreak .

El comportamiento de la tecla BREAK depende de otros bits del controlador de visualización que no estén establecidos por curses.

Modalidad de retardo

Las siguientes modalidades de retardo mutuamente excluyentes especifican la rapidez con la que determinadas funciones de curses vuelven a la aplicación cuando no hay ninguna entrada de terminal en espera cuando se llama a la función:
Retardo Descripción
Sin retardo La función falla.
Retardo La aplicación espera hasta que la implementación pasa texto a través de la aplicación. Si se establece la modalidad cbreak o la modalidad sin formato, esto es después de un carácter. De lo contrario, es después del primer carácter de nueva línea, el carácter de fin de línea o el carácter de fin de archivo.

El efecto de la modalidad Sin retardo en el proceso de tecla de función no está especificado.

Proceso en modalidad de eco

La modalidad de eco determina si se repiten los caracteres escritos en la pantalla. El efecto de la modalidad de eco es análogo al efecto del distintivo de eco en el campo de modalidad local de la estructura termios asociada con el dispositivo de terminal conectado a la ventana. Sin embargo, las maldiciones siempre borran el distintivo de eco cuando se invocan, para impedir que el sistema operativo realice el eco. El método de eco de caracteres no es idéntico al método del sistema operativo de eco de caracteres, porque las cursis realizan un proceso adicional de entrada de terminal.

Si está en modalidad de eco, las maldiciones realizan su propio eco. Cualquier carácter de entrada visible se almacena en la ventana actual o especificada por la función de entrada a la que la aplicación ha llamado, en la posición del cursor de dicha ventana, como si se llamara a la subrutina addch , con todos los efectos consiguientes como el movimiento y el ajuste del cursor.

Si no está en modalidad de eco, la aplicación debe realizar cualquier repetición de la entrada. Las aplicaciones a menudo realizan su propio eco en un área controlada de la pantalla, o no hacen eco en absoluto, por lo que inhabilitan el modo eco.

Puede que no sea posible desactivar el proceso de eco para terminales síncronos y asíncronos de red porque el proceso de eco lo realizan directamente los terminales. Las aplicaciones que se ejecutan en estos terminales deben tener en cuenta que cualquier carácter escrito se mostrará en la pantalla en el punto en el que está situado el cursor.

A continuación se muestra una parte de la familia de subrutinas de proceso de eco:
Subrutina Descripción
cbreak o nocbreak Coloca el terminal en o lo saca de la modalidad CBREAK
salida_retardo Establece el retardo de salida en milisegundos
echo o noecho Controla el eco de los caracteres escritos en la pantalla
retardo medio Devuelve ERR si no se ha escrito ninguna entrada después del bloqueo durante un periodo de tiempo especificado
nl o nonl Determina si curses convierte una nueva línea en un retorno de carro y salto de línea en la salida, y convierte un retorno en una nueva línea en la entrada
raw o noraw Coloca el terminal en modo o fuera de modo

La subrutina cbreak realiza un subconjunto de las funciones realizadas por la subrutina raw . En la modalidad cbreak, los caracteres tecleados por el usuario están inmediatamente disponibles para el programa, y no se realiza el proceso de borrar o matar caracteres. A diferencia del modo RAW, se actúa sobre los caracteres de interrupción y flujo. De lo contrario, el controlador tty almacena en el almacenamiento intermedio los caracteres escritos hasta que se escribe una nueva línea o un retorno de carro.

Nota: La modalidad CBREAK inhabilita la conversión por parte del controlador tty.

La subrutina delay_output establece el retardo de salida en el número de milisegundos especificado. No utilice esta subrutina excesivamente porque utiliza caracteres de relleno en lugar de una pausa del procesador.

La subrutina echo pone el terminal en modalidad de eco. En modalidad de eco, las cursas escriben los caracteres escritos por el usuario en el terminal en la posición física del cursor. La subrutina noecho saca el terminal de la modalidad de eco.

Las subrutinas nl y nonl , respectivamente, controlan si curses convierte las nuevas líneas en retornos de carro y saltos de línea en la salida. y si curses convierte los retornos de carro en nuevas líneas en la entrada. Inicialmente, estas traducciones se producen. Al inhabilitar estas conversiones, la biblioteca de subrutinas curses tiene más control sobre la capacidad de salto de línea, lo que da como resultado un movimiento más rápido del cursor.

La subrutina nocbreak saca el terminal de la modalidad cbreak.

La subrutina raw pone el terminal en modalidad sin formato. En la modalidad sin formato, los caracteres escritos por el usuario están inmediatamente disponibles para el programa. Además, los caracteres de interrupción, salida, suspensión y control de flujo se pasan sin interpretar en lugar de generar una señal como lo hacen en el modo cbreak. La subrutina noraw saca el terminal de la modalidad en bruto.

Utilización de los archivos terminfo y termcap

Cuando se inicializa curses, comprueba la variable de entorno TERM para identificar el tipo de terminal. A continuación, las maldiciones buscan una definición que explique las prestaciones del terminal. Esta información se guarda normalmente en un directorio local especificado por la variable de entorno TERMINFO o en el directorio /usr/share/lib/terminfo . En primer lugar, todos los programas de maldiciones comprueban si la variable de entorno TERMINFO está definida. Si esta variable no está definida, se comprueba el directorio /usr/share/lib/terminfo .

Por ejemplo, si la variable TERM se establece envt100y la variable TERMINFO se establece en el archivo /usr/mark/myterms , realiza una comprobación del archivo /usr/mark/myterms/v/vt100 . Si este archivo no existe, curses comprueba el archivo /usr/share/lib/terminfo/v/vt100 .

Además, las variables de entorno LINES y COLUMNS se pueden establecer para alterar temporalmente la descripción de terminal.

Escritura de programas que utilizan las subrutinas terminfo

Utilice las subrutinas terminfo cuando el programa deba tratar directamente con la base de datos terminfo. Por ejemplo, utilice estas subrutinas para programar teclas de función. En todos los demás casos, las subrutinas de maldiciones son más adecuadas y se recomienda su uso.

Inicialización de terminales

El programa debe empezar llamando a la subrutina setupterm . Normalmente, esta subrutina se llama indirectamente mediante una llamada a la subrutina initscr o newterm . La subrutina setupterm lee las variables dependientes de terminal definidas en la base de datos terminfo . La base de datos terminfo incluye variables booleanas, numéricas y de cadena. Todas estas variables terminfo utilizan los valores definidos para el terminal especificado. Después de leer la base de datos, la subrutina setupterm inicializa la variable cur_term con la definición de terminal. Al trabajar con varios terminales, puede utilizar la subrutina set_curterm para establecer la variable cur_term en un terminal específico.

Otra subrutina, restartterm, es similar a la subrutina setupterm . Sin embargo, se llama después de que la memoria se restaure a un estado anterior. Por ejemplo, llamaría a la subrutina restartterm después de una llamada a la subrutina scr_restore . La subrutina restartterm presupone que las opciones de entrada y salida son las mismas que cuando se guardó la memoria, pero que el tipo de terminal y la velocidad en baudios pueden diferir.

La subrutina del_curterm libera el espacio que contiene la información de capacidad para un terminal especificado.

archivos de cabecera

Incluya los archivos curses.h y term.h en el programa en el orden siguiente:

#include <curses.h>
#include <term.h>

Estos archivos contienen las definiciones de las series, números y distintivos de la base de datos terminfo .

Manejo de prestaciones de terminal

Pase todas las series parametrizadas a través de la subrutina tparm para crear una instancia de las mismas. Utilice la subrutina tputs o putp para imprimir todas las series terminfo y la salida de la subrutina tparm .

Subrutina Descripción
putp Proporciona un acceso directo a la subrutina tputs
tparm Crea una instancia de una serie con parámetros
tputs Aplica información de relleno a la serie dada y la genera

Utilice las subrutinas siguientes para obtener y pasar prestaciones de terminal:

Subrutina Descripción
tigetflag Devuelve el valor de una prestación booleana especificada. Si la capacidad no es booleana, se devuelve -1.
núm_tiem Devuelve el valor de una prestación numérica especificada. Si la capacidad no es numérica, se devuelve -2.
tigetstr Devuelve el valor de una prestación de serie especificada. Si la capacidad especificada no es una cadena, la subrutina tigetstr devuelve el valor de(char *) -1.

Salida del programa

Cuando el programa salga, restaure las modalidades tty a su estado original. Para ello, llame a la subrutina reset_shell_mode . Si el programa utiliza el direccionamiento de cursor, debe generar la serie enter_ca_mode durante el inicio y la serie exit_ca_mode cuando salga.

Los programas que utilizan escapes de shell deben llamar a la subrutina reset_shell_mode y generar la serie exit_ca_mode antes de llamar al shell. Después de volver del shell, el programa debe generar la serie enter_ca_mode y llamar a la subrutina reset_prog_mode . Este proceso difiere de las operaciones de curses estándar, que llaman a la subrutina endwin al salir.

Subrutinas de pantalla de bajo nivel

Utilice las subrutinas siguientes para manipulaciones de pantalla de bajo nivel:

Subrutina Descripción
ripoffline Elimina una sola línea del stdscr
volcado de trabajo Vuelca el contenido de la pantalla virtual en un archivo especificado
inicio_scrt Inicializa las estructuras de datos curses desde un archivo especificado
scr_restore Restaura la pantalla virtual en el contenido de un archivo volcado anteriormente

subrutinas termcap

Si el programa utiliza el archivo termcap para información de terminal, las subrutinas termcap se incluyen como ayuda de conversión. Los parámetros son los mismos para las subrutinas termcap . Curses emula las subrutinas utilizando la base de datos terminfo . Se proporcionan las siguientes subrutinas termcap :

Subrutina Descripción
tgetent Emula la subrutina setupterm .
distintivo tgetflag Devuelve la entrada booleana para un identificador termcap.
númtgetm Devuelve la entrada numérica para un identificador de termcap.
tgetstr Devuelve la entrada de serie para un identificador termcap.
tgoto Duplica la subrutina tparm . La salida de la subrutina tgoto debe pasarse a la subrutina tputs .

Conversión de descripciones de termcap a descripciones terminfo

El mandato captoinfo convierte las descripciones termcap en descripciones terminfo . El ejemplo siguiente ilustra cómo funciona el mandato captoinfo :
captoinfo /usr/lib/libtermcap/termcap.src

Este mandato convierte el archivo /usr/lib/libtermcap/termcap.src al origen terminfo . El mandato captoinfo graba la salida en la salida estándar y conserva los comentarios y otra información del archivo.

Manipulación de TTYs

Las siguientes funciones guardan y restauran el estado de las modalidades de terminal:

Funciones Descripción
savetty Guarda el estado de las modalidades tty.
restablecimiento Restaura el estado de las modalidades tty a la última vez que se llamó a la subrutina savetty .

Terminales asíncronos síncronos y en red

Los terminales asíncronos síncronos, síncronos en red (NWA) o no estándar conectados directamente se utilizan a menudo en un entorno de sistema principal y se comunican con el sistema principal en modalidad de bloque. Es decir, el usuario escribe caracteres en el terminal y, a continuación, pulsa una tecla especial para iniciar la transmisión de los caracteres al sistema principal.

Nota: Aunque puede ser posible enviar bloques de tamaño arbitrario al host, no es posible o deseable hacer que un carácter se transmita con una sola pulsación. Hacerlo podría causar problemas graves a una aplicación que hace uso de una entrada de un solo carácter.

Resultado

La interfaz de maldiciones se puede utilizar para todas las operaciones que pertenecen a la salida en el terminal, con la posible excepción de que en algunos terminales, la rutina refresh puede tener que volver a dibujar todo el contenido de la pantalla para realizar cualquier actualización.

Si además es necesario borrar la pantalla antes de cada operación de este tipo, el resultado podría ser indeseable.

Entrada

Debido a la naturaleza de la operación de los terminales síncronos (modalidad de bloque) y NWA, es posible que no sea posible soportar todas o ninguna de las funciones de entrada curses. En particular, tenga en cuenta los siguientes puntos:
  • Es posible que la entrada de un solo carácter no sea posible. Puede ser necesario pulsar una tecla especial para hacer que todos los caracteres tecleados en el terminal se transmitan al sistema principal.
  • A veces no es posible inhabilitar echo. El eco de caracteres puede ser realizado directamente por el terminal. En los terminales que se comportan de esta forma, cualquier aplicación de maldiciones que realice la entrada debe tener en cuenta que cualquier carácter escrito aparecerá en la pantalla en el punto en el que esté situado el cursor. Esto no se corresponde necesariamente con la posición del cursor en la ventana.