Este documento presenta una introducción al desarrollo de aplicaciones de consola en diferentes plataformas como *NIX, Windows y de forma cruzada. Explica la arquitectura del terminal en *NIX y Windows, las novedades de Windows 10 para aplicaciones de consola, y diferentes opciones para desarrollar aplicaciones de consola de forma cruzada usando .NET Standard y bibliotecas como ncurses y Win32 Console API.
4. Quién soy yo?
• Desarrollador @ PlainConcepts
• Cervecero aficionado
• Padre orgulloso
• Speaker donde me dejen
• Empecé a programar en una
Odissey… ¡y hasta ahora!
• Microsoft MVP desde 2012
6. ¿Pero… eso todavía existe?
• Dwarf fortress - http://www.bay12games.com/dwarves/
• Actualmente en desarrollo (desde 2006)
• Jugadores estimados: ~150K
7. ¿Qué vamos a ver?
• El terminal en el mundo *NIX
• El terminal en el mundo Windows
• Novedades de Windows 10
• Desarrollando en cross-platform con netstandard
12. En *NIX todo es un fichero
• No existe concepto de pantalla
• No existe concepto de cursor
• No existe concepto de colores
• No existe concepto de teclado
• Y por supuesto... No existe concepto de ratón
13.
14. Solución: carácteres especiales
• ASCII: 7 bits
• 128 caracteres
• 95 caracteres
imprimibles
(letras,
números,
símbolos)
• 33 caracteres
especiales y de
control
16. Secuencias de carácteres
• Los fabricantes de terminales introdujeron
secuencias de carácteres propias para realizar
ciertas tareas
• Sin ninguna estandarización
17. Termcap / Terminfo
• “BBDD” incluída en *NIX que contiene
• Una lista de terminales “conocidos”
• Capacidades de cada terminal
• Secuencia de control que debe mandarse para dicha
capacidad en cada terminal
18. Termcap / Terminfo vs ANSI
• En los 1976 se creó un estándard ANSI para poner orden
• Secuencias de escape ANSI
• A no ser que quieras soportar terminals MUY antiguos no
debes preocuparte de termcap/terminfo
• Adhiérete a los códigos ANSI y vas sobrado.
• MS-DOS: Soporta parcialmente códigos ANSI
• Atari ST: Soporta ANSI aunqué con extensions propias
• AmigaOS: Soporta ANSI, tanto en pantalla como en
impresora
• Windows: ejem, ejem, ejem…
19. Entrada (teclado y ratón)
• Recuerda: solo puedes leer carácteres
• Ciertas combinaciones de carácteres indicarán
teclas pulsadas
• Algunas teclas son complicadas/imposibles de detectar
(ALT)
• No existen eventos tipo “OnKeyDown/OnKeyUp”
21. En Windows todo es un objeto
• API específica para pantalla
• API específica para cursor
• Soporte específico para colores
• Soporte específico para teclado
• Y sí: soporte de ratón (aunque lo veas poco)
22.
23. Win32 Console API
• API de Consola nativa de Windows
• Sin apenas cambios desde Windows 2000
• La consola existe como concepto en Windows y la API
llega mucho más lejos de lo que llega la
contraparte *NIX
• Win32 también soporta ver el terminal como un
fichero, aunque eso está muy limitado.
25. Modos de color
• ANSI (8*2 colores)
• 256 colors (xterm-256)
• True color (16M).
• Win32: Soporte para 8*2 colores
26. Soporte de modos de color
• *NIX: Out of the box usando la secuencia correcta
• Win32: Limitado a 8*2 colores
• ¿Puedo soportar +16 colores en Windows?
• Respuesta corta: NO
• Respuesta larga: Depende…
27. Modos de color avanzados en Win32
• Windows 10 soporta secuencias de escape ANSI
• https://docs.microsoft.com/en-us/windows/console/console-
virtual-terminal-sequences
• Basta con usar secuencias de escape xterm-256 para
tener 256 colores en Windows
• Aunque para ello la consola debe tener el modo
ENABLE_VIRTUAL_TERMINAL_PROCESSING
• ¡La API de Consola NO LO SOPORTA!
29. *NIX vs Win
• En *NIX el usuario lanza un terminal y desde el
terminal una app
• En Windows el usuario nunca lanza la consola
(conhost). La consola la crea la app
• Sí: cmd.exe no es una consola. Cmd.exe es una app
que lee desde conhost.exe y escribe a conhost.exe
30. *NIX vs Win
• Tanto en Win como en *NIX la app y la consola son
procesos separados
• En *NIX se comunican vía texto. En Win via IOCTL
• En Windows la consola es siempre conhost.exe.
• Windows controla la creación de pipes mediante
los que se comunican la consola y la app
• De verdad, que cosas como ConEmu, Console2 y
similares funcionen en Windows es casi un milagro
del desarollo.
31. Windows 10 ConPTY
• Windows 10 introduce por primera vez una
arquitectura PTY
• PTY: Pseudo terminal. S/W que parece a un terminal
físico (tty) pero que en lugar de comunicarse con un
terminal físico real lo hace con otro programa
• Eso abre la puerta a multiplexar aplicaciones de
consola y a poder (¡por fin!) reemplazar conhost y
simplifica el remoting de apps Windows 10
37. Consola en netstandard
• En consola netstandard soporta:
• 8*2 colores
• Lectura/escritura desde y a consola
• Abstrae parcialmente el teclado
• Cursor
• No soporta / abstrae
• Ratón
• Modos avanzados de color
• Teclado al 100%
40. Aplicaciones cross-platform
• Para usar Win32 Console API o terminfo necesitas
usar p/invoke
• El uso de terminfo directamente es muy pesado así
que en *NIX se desarrolló una librería que se ha
convertido es standard de facto
41. (n)curses
• ncurses es una librería que se encarga de gestionar
el terminal en *NIX
• Usa termcap/terminfo por lo que soporta cualquier
terminal
• Unifica el tratamiento de terminales, pero a cambio
viene con sus propias abstracciones (p. ej. Color
Pairs).
42. Una aproximación hoy en día
• Para realizar una app cross-platform con
netstandard hay que separar el modulo que
interacciona con el terminal y ofrecer varias
implementaciones:
• Ncurses: Para *NIX usando ncurses.
• Win32 API: Para Windows 7 y anteriores
• VT-ANSI + Win32 API: Para Windows 10
• System.Console: Para cualquier plataforma. Limitado
43. Librerías cross-platform
• Gui.cs (Miguel De Icaza)
• https://github.com/migueldeicaza/gui.cs
• Drivers de System.Console, Win32, ncurses
• Console framework
• http://elw00d.github.io/consoleframework/
• Drivers de Win32, ncurses
• TVision2 (mía, eso es puro autobombo xD)
• https://github.com/eiximenis/tvision2
• Drivers de System.Console, Win32, ncurses, VT-ANSI,
termcap