• Publicidad

ANSI escapes y VT para "emular" (n)curses

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

ANSI escapes y VT para "emular" (n)curses

Notapor creating021 » 2007-09-18 19:04 @836

Bueno, me ha dado por jugar con VT100 y superiores, con ANSI escapes y se me ocurrió "emular" (n)curses con ésto.

¿Qué dicen, sería interesante o muuuuy mala idea?

Y sí, ya se que existe curses para Perl en CPAN :)

http://www.termsys.demon.co.uk/vtansi.htm
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor creating021 » 2007-09-28 17:34 @773

Al hacer esto ->
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print '\e[2J';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Por qué no funciona e imprime el escape si uso ' ' ?

PD: con comillas ( " " ) no hay problema. :?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-09-28 20:51 @910

Ya lo dice perldata... porque el backslash no 'escapa' cuando está entrecomillado simple (salvo cuando está junto a otra comilla u otro backslash).

En concreto, en la sección Quote-and-Quote-like-Operators de perlop se dice que, las secuencias como '\e' están disponibles en construcciones que interpolan. Y la forma de interpolar es con ("") o (qq()).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-09-29 09:11 @424

Es que yo creía que la VT lo interpreta (el código, donde \e era, \e y no un "valor escapado") y con un editor hexadecimal veo que no es así y se necesita escapar.

¡Gracias!
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor creating021 » 2007-10-12 15:29 @687

Más dudas :oops:

Como todos (o muchos) sabemos, en la terminal sólo hay un cursor (para imprimir) esto quiere decir que no se puede "dibujar" o imprimir en la terminal dos textos distintos en la misma terminal al mismo tiempo y en lugares distintos, tiene que ser texto por texto.

Bien, los botones, cajas y diálogos son una matriz de caracteres y solo se puede "dibujar" uno por uno entonces encuentro un problema... supongamos que tengo un campo (entry) y una etiqueta (label).

Esa etiqueta se actualiza cada X tiempo gracias a una función (del programa que es cliente del módulo) por medio de un fork.

Como es de esperarse, el usuario puede empezar a llenar el campo y en ese momento la etiqueta se puede estar actualizando.

Esto haría que el cursor fuera de un lado a otro y si la modificación es constante esto sería un caos.

¿Cómo podría controlar esto?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-10-12 16:54 @746

Una terminal de Unix sigue la misma filosofía que el resto de Unix: aparentar que es un fichero, por lo que tendrá entradas y salidas como si escribiéramos en un fichero.

Si dos o más programas tienen permiso para escribir en la terminal del usuario (por ejemplo, varios programas ejecutados en segundo plano), sus salidas saldrán, efectivamente, en la posición actual del cursor.

Esta forma de trabajar es muy distinta de cuando antiguamente se accedía directamente a la memoria de vídeo. Al ser ahora terminales virtuales, tienen la ventaja de ser 'independientes' del hardware subyacente, pero tienen la desventaja de no tener muchas posibilidades de acceso simultáneo o aleatorio, como cuando accedemos a la memoria de vídeo de la tarjeta gráfica.

Incluso si pensamos en utilizar las secuencias de escape para recordar la actual posición del cursor, cambiarlo a una nueva, pintar algo, y recuperar la posición anterior, siempre darse el caso de que ocurra otra interrupción de otro proceso que quiera pintar en otro sitio.

Hay varias soluciones. Una de ellas es crear una "memoria de pantalla" fuera de la pantalla. Un lugar de memoria compartida donde los procesos puedan escribir de forma 'simultanea'. Y luego un proceso que vaya refrescando la pantalla con el valor de los cambios introducidos.

El módulo Curses hace algo parecido. Escribes texto con addstr(), pero no aparece hasta que haces un standout()/refresh(). Curses se ocupa de que la salida sea con el menor número posible de caracteres, optimizando secuencias de escape.

En tu caso, sería desviar el pintado, desde la pantalla a ese buffer (podría ser un simple array que almacene las líneas de pantalla). Y que otro programa se encargase de pintar o actualizar esa parte, cuando el usuario no esté escribiendo.

Seguro que hay más opciones...

Actualización: encontré el script rep que es un ejemplo de uso de Curses con repetición de ejecución de un comando.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-10-12 18:59 @832

:) ¡Eso me da buenas ideas!
Inicialmente (y actualmente) trabajaba en un código en el cual se crean los elementos (del diálogo) usando los objetos hereditarios de Perl.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub elementoA {
  $self->{Type} = "elementoA";
  $self->{Text} = "TEXTO de elemento A";
  $size = (length $slef->{Text}) + 2;
  $self->{Size} = $size."x"."1"; #columnas x filas
  return $self;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como se puede ver, se necesita de una función que dibuje a elemntoA.
Esta función debe modificar el grupo de objetos a una forma más simple y útil (ubicación, tamaño final).
Luego viene la función de eventos y con ella la función que refresca.

Este método es bueno (en teoría) para usar la forma de graficar el diálogo tal como vos comentás (él de curses) pero ahora lo maluco es hacer la parte de dibujo (que camine a través de los objetos y simplifique); a ver qué se me ocurre para esto.

Gracias por la ayuda.
Última edición por creating021 el 2007-10-27 13:41 @612, editado 1 vez en total
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-10-18 05:21 @265

Acabo de encontrar Term::Visual que permite acciones simultáneas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-10-21 17:56 @788

Después lo veré, ahora ando en el mismo cuento.

Teniendo el método de hashes no encuentro un algoritmo para hacer optimización de matriz, eso quiere decir que no sé como limitar tamaños de botones (elementos) ni dibujarlo.

No sé cómo imprimir las cosas según el tamaño de la terminal (el tamaño lo saco con varios métodos).

¿Me pueden dar ideas de cómo hacer esto?

Gracias.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-10-21 20:14 @885

Eso puede ser muy complicado... piensa en cómo puede funcionar un motor de renderizado de HTML...

Si los tamaños están expresados en porcentajes, será más fácil.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados