Introducción y Presentación

Introducción y Presentación ✔ Tema: Como funciona la librería Turbo Vision en Linux. Es un descripción de las IOCTLs, secuencias de escape y demás té

5 downloads 58 Views 423KB Size

Recommend Stories


y
1 4 5 6 7 8 9 10 11 12 13 14 15 16 12 19 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 11 y 12 35 36 37 38 39 40 41 42 43 44 45 46 47

y
Regional Distrito Capital La Regional Distrito Capital del Servicio Nacional de Aprendizaje SENA, de conformidad con los principios de transparencia

DESUSO Y VENTA Y REEMPLAZO
DESUSO Y VENTA Y REEMPLAZO Bienes muebles amortizables fuera de uso. Tratamiento impositivo: cuando alguno de los bienes amortizables, salvo los inmu

73 y las leyes , , , y )
Ley Nº 17.671 Registro Nacional de las Personas (Con las reformas del decreto-ley 1301/73 y las leyes 20.974, 21.807, 22.435, 22.863 y 23.023) Identif

Story Transcript

Introducción y Presentación ✔ Tema:

Como funciona la librería Turbo Vision en Linux. Es un descripción de las IOCTLs, secuencias de escape y demás técnicas usadas para obtener el máximo posible de la consola. ✔ Expone: ➔ Ing. Salvador Eduardo Tropea (SET) ➔ INTI - CITEI (Gobierno argentino) ➔ BALUG/UYLUG ➔ IEEE ➔

¿Qué es Turbo Vision? ✔ Interfaz

de usuario de texto (TUI). ✔ Provee una interfaz "simple" con: ventanas, diálogos, botones, check-box, soporte para mouse, etc.

¿Qué es Turbo Vision? Originalmente creada por Borland alrededor de 1990. Mantenida hasta 1994 aprox. Liberada al público en 1996. FAQ -> P.D. Pero no aclarado. Adaptada a gcc/djgpp por Robert Höhne 1996-1998. Mantenida por Salvador Eduardo Tropea (SET) 1998-2002... ✔ Lenguaje: C++, no STL. ✔ Actualmente disponible para DOS (djgpp) Linux (consola, XTerm/Eterm y X11) UNIX en general (FreeBSD y Solaris por ejemplo consola y X11) Win32 (API de consola y GDI) Driver específico para QNX. GCC, Borland C++ y MSVC X86, ARM, Alpha, PPC, SPARC, etc. ✔

¿Por qué necesita un tratamiento especial de entrada/salida? Originalmente escrita para DOS. ✔ Uso de muchas combinaciones de teclas "CUA". ✔ Uso de caracteres especiales (marcos, flechas, grisados, etc.). ✔ Aplicaciones principales: InfView, SETEdit y RHIDE -> estilo IDE BC++. ✔ Exigencia de velocidad de video != VI. ✔

Arquitectura de pseudo-drivers ✔ En la versión 2.0.0 se introdujo el concepto de drivers. ✔ No son verdaderos drivers porque no se cargan como módulos. ✔ Probablemente si en el futuro. ✔ Basicamente explotan el uso de punteros a funciones (técnica de

sobre las clases de C++. ✔ Permite mantener la compatibilidad con el código anterior. Ejemplo: ushort TDisplay::getCols(); Pasa a ser: ushort (*TDisplay::getCols)();

Que apunta a una función: ushort TDisplay::defaultGetCols();

Que es reemplazada por: ushort TDisplayLinux::GetCols(); ✔ Durante

la inicialización se prueban los distintos drivers disponibles, el primero que es inicializado con éxito es el que se usa. El orden depende de la prioridad de cada uno que puede alterarse

C)

Drivers para GNU/Linux ✔ Disponibles:

X11, Linux, XTerm y UNIX. ✔ Hablamos del driver Linux. ✔ Usado cuando TERM=console || linux* ✔ Válido para la consola de Linux. ✔ Explota características específicas de Linux: Modificadores de teclado. Acceso directo a la memoria de video. Mapas Unicode de aplicación y pantalla. Fonts. Paleta de colores. Cambio de consola virtual.

Drivers para GNU/Linux ✔ No

basado en curses. ¿Por qué? Descripción de terminales incorrectas. Limitaciones en la descripción de terminales. Escasa funcionalidad. Mucha interferencia. ✔ Vemos los detalles más jugosos, no todo.

Teclado ✔

No usa modo raw, más seguro. Pero cambia el modo de la terminal: tcgetattr(hIn,&inTermiosOrig); memcpy(&inTermiosNew,&inTermiosOrig,sizeof(inTermiosNew)); inTermiosNew.c_iflag|= (IGNBRK | BRKINT); // Ignore breaks inTermiosNew.c_iflag&= ~(IXOFF | IXON); // Disable Xon/off // Character oriented, no echo, no signals inTermiosNew.c_lflag&= ~(ICANON | ECHO | ISIG); tcsetattr(hIn,TCSAFLUSH,&inTermiosNew);



Es necesario usar O_NONBLOCK (sino se pierden cosas). stdin == stdout (dupped?) => File Status Flags compartidos => Linux pierde información de salida al salir de la aplicación => open de nuevo. oldInFlags=fcntl(hIn,F_GETFL,0); newInFlags=oldInFlags | O_NONBLOCK; fcntl(hIn,F_SETFL,newInFlags);

Parseo de secuencias de escape [que son] ej. \E[17~ => F6 ✔ Interprete de valores ASCII ej. 1 => ^A ✔ Información adicional con la ioctl TIOCLINUX, servicio 6. ✔

int arg=6; if (ioctl(hIn,TIOCLINUX,&arg)!=-1) kblNormal=0, kblShift=1, kblAltR=2, kblCtrl=4, kblAltL=8;

Teclado: Casos Especiales El kernel se reserva teclas en la mayor parte de los mapas de teclado usados. Ejemplo: Shift+PgUp => page scroll up. ✔ Solución: retoque de las tablas de teclado. Ejemplo: Shift+PgUp => PgUp => lo recibe la aplicación. ✔ Mediante ioctls: ioctl(hIn,KDGKBENT,&entry)  Get Entry ioctl(hIn,KDSKBENT,&entry)  Set Entry ✔ Estructura kbentry: kb_table: Modificadores  cual tabla kb_index: Scan  índice en la tabla kb_value: Valor asignado  función asignada ✔ Memoriza la función original de la tecla a desviar y de la tecla sin modificadores. Cambia la función de la tecla con modificador a la función de la tecla sin. ✔

Cambio de Consola Es necesario restaurar el mapa de teclado. También se usa para restaurar otras cosas. ✔ Mediante ioctls y signals. ✔ Signal SIGUSR1 la usamos para cuando nos quitan la consola. Se confirma con: ioctl(hIn,VT_RELDISP,VT_PROCESS); ✔ Signal SIGUSR2 la usamos para cuando nos devuelven la consola. Se confirma con: ioctl(hIn,VT_RELDISP,VT_ACKACQ); Se sabe que pasó a activa con: ioctl(hIn,VT_WAITACTIVE,ourVT); ✔ Para saber en que consola estamos: ✔

ttyName=ttyname(STDOUT_FILENO)  nombre sscanf(ttyName,"/dev/tty%2d",&ourVT) o sscanf(ttyName,"/dev/vc/%2d",&ourVT) ✔ Para recibir las signals mencionadas: ioctl(hIn,VT_GETMODE,&oldVTMode) ioctl(hIn,VT_SETMODE,&newVTMode) struct vt_mode newVTMode newVTMode.mode =VT_PROCESS; newVTMode.relsig=SIGUSR1; newVTMode.acqsig=SIGUSR2;

Pantalla ✔ Problemas

a solucionar: Velocidad de acceso: /dev/vcsa Uso caracteres especiales sin perder velocidad: Mapas Unicode (ACM) y (SFM). Soporte para estos caracteres aún sin acceso a VCSA: DEC charset G1 página K (ISO 2022) y modo UTF-8. Paleta de colores: Secuencias de escape e ioctl. Fonts: ioctls. Restaurar pantalla: con y sin VCSA (TIOCLINUX). Cursor.

Velocidad de acceso ✔ Refresco

de pantalla usando secuencias de escape es muy

lento. ✔ FreeBSD provee un mecanismo avanzado de refresco de pantalla. ✔ Linux provee dispositivos para acceder directamente a la VC. ✔ /dev/vcsaN donde N es el número de VC. ✔ Layout: Alto, Ancho, posición X del cursor, posición Y, Caracter, Atributo, ... ✔ Desventajas: Usualmente los sistemas no dan acceso a estos dispositivos. Seguridad e ignorancia. No hay remapeo, mayor velocidad pero hay que saber mucho sobre la font usada.

Caracteres Especiales ✔ El

uso de /dev/vcsa* acelera pero nos obliga a usar la codificación de la font que use Linux, lo mismo debería suceder aún cuando no podemos acceder a VCSA. ✔ Linux usa ISO 2022 y provee una página K que es tranparente. fputs("\e)K\xE",stdout) G1=K y usar G1. ✔ Problema: caracteres en el rango 0-31, 127-159 son de control. El mapa G1 pone al kernel en modo raw y el rango se reduce. El resto quedan entre 0 y 31 y el mismo kernel los testea usando una máscara de 32 bits: 0x0800f501 Hay una excepción: Meta+ESC  128+27=155 Para ellos la única solución es usar el modo Unicode UTF-8 Unicodes 0xF0xx => transparente. Entrar a UTF-8 \e%G Salir de UTF-8 \e%@

Codificación: ACM/SFM ✔ Internamente

el kernel usa Unicode de 16 bits. No existen CP. ✔ Dos tablas se encargan de traducir los símbolos. ✔ ACM: Application Charset Map. Indica como está codificada la información proveniente desde las aplicaciones. Tabla. // GIO_UNISCRNMAP: get full Unicode screen mapping ushort scrUniMap[E_TABSZ]; if (ioctl(hOut,GIO_UNISCRNMAP,scrUniMap)!=-1)

✔ SFM:

Screen Font Map. Indica que Unicodes representa cada símbolo de la font usada. No es una tabla (no 1 a 1). // GIO_UNIMAP: get unicode-to-font mapping from kernel struct unimapdesc map; map.entry_ct=512; // Entradas que disponemos, responde que grabó map.entries=new struct unipair[512]; if (ioctl(hOut,GIO_UNIMAP,&map)==-1)

✔ Cada

entrada es un par fontpos/unicode. ✔ Problemas: Errores en los mapas, mapas que no usan Unicode (KOI-8), caracteres no Unicode, etc.

Fonts ✔ Hasta

512 símbolos. Si se usan 512 se reduce a 8 colores. ✔ Alto máximo 32 píxeles, todas las llamadas esperan buffers con este alto, no importa cual sea el alto actual. ✔ ioctl: KDFONTOP usa una estructura console_font_op definida en linux/kd.h. struct console_font_op { unsigned int op; // unsigned int flags; // unsigned int width, height;// unsigned int charcount; // unsigned char *data; // };

✔ Las

Operación KD_FONT_OP_* KD_FONT_FLAG_* Tamaño Cantidad de caracteres Datos con alto 32 *fijo*,formato VGA

dos operaciones más útiles: KD_FONT_OP_SET y KD_FONT_OP_GET. ✔ Para obtener información se hace un GET con tamaños máximos (16x32 por ejemplo).

Paleta de colores ✔ Linux

soporta paletas de colores individuales para cada VC. ✔ El soporte es irregular e incompleto: La paleta de la consola puede modificarse con secuencias de escapes pero es imposible saber el estado actual de esta manera. ✔ Setear: \E]P%1.1X%2.2X%2.2X%2.2X Ejemplo: \E]P10000A8 ✔ Las ioctls para setear la paleta afectan a la paleta usada por default para las consolas y a todas las consolas. No sirve. ✔ Las ioctls para leer leen la que es por defecto, no se puede leer la actual de una consola. uchar vtColors[16*3]; // Get default VT colors map int ret=ioctl(hOut,GIO_CMAP,vtColors);

Restaurar pantalla Indispensable para RHIDE (debug). ✔ En terminales más avanzadas se usa un segundo buffer (XTerm, limitado) en APIs completas se usan mecanismos ad hoc (Win32) :-( ✔ Cuando tenemos acceso de lectura a VCSA se puede leer. ✔ Sin acceso a VCSA hay un truco: seleccionar el contenido de la pantalla y luego pedir que lo pegue. ✔ ioctl: TIOCLINUX. Seleccionar: servicio 2. Pegar: servicio 3. ✔ Problema: sólo el texto sin atributos. ✔ Posición del Cursor: VCSA: Directamente, offset 2. Terminal: setea con \E[y;xH pregunta con \E[6n. ✔ Colores usados: No hay una manera simple (API asimétrica). Pero hay \E7 y \E8 que graban la posición del cursor, attributos y juego de caracteres en uso. ✔

Fin ¿Preguntas? URLs: http://tvision.sf.net/ http://setedit.sf.net/ http://www.rhide.com/ http://www.balug.org.ar/ http://www.inti.gov.ar/

Proyecto TV Proyecto SETEdit Proyecto RHIDE BALUG INTI

E-mail: [email protected]

setSel sel; sel.service=2; // Set selection sel.xs=1; sel.ys=1; sel.xe=width; sel.ye=height; // The whole screen sel.sel_mode=0; // Character by character fflush(TGKeyLinux::fIn); // Be sure we don't mix stuff if (ioctl(hOut,TIOCLINUX,&sel)!=-1) {// Ok, now we get the screen content, but no the colors char val[2]; int character,w=width; val[1]=0x07; // Default color // Now paste the selection (the whole screen) sel.service=3; ioctl(hOut,TIOCLINUX,&sel);

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.