Turbo Vision 2.0 - La recreación de la UI de texto de los 90
(github.com/magiblot)- Un port open source que moderniza el framework de UI de texto de Borland de los 90 con soporte multiplataforma + Unicode
- Al crear apps de terminal, no hace falta lidiar con la compatibilidad entre terminales: funciona con el mismo código en Linux, Windows y DOS
- Ya incluye widgets de TUI como ventanas superpuestas redimensionables, menús desplegables, diálogos, botones, barras de desplazamiento, campos de entrada, casillas de verificación y botones de opción, así que se pueden usar directamente sin implementarlos desde cero
- Soporte completo de Unicode UTF-8 — mantiene la API existente basada en
char, pero aun así puede manejar caracteres CJK de ancho completo, caracteres combinados e incluso emoji; con una sola llamada amoveStr(), el desplazamiento y recorte multibyte se resuelven automáticamente - Aprovecha el soporte de
setlocaleUTF-8 del RTL de Microsoft para que código comostd::ifstream f("コンピュータ.txt")funcione igual en Windows - Soporte de true color de 24 bits — se amplió de las 16 colores tradicionales a RGB, xterm-256 y colores predeterminados del terminal; si el terminal no lo soporta, convierte automáticamente al color más cercano
- Soporta toda la entrada/salida moderna, incluyendo rueda del mouse, botón central, triple clic, tamaños de pantalla de hasta 32767 filas/columnas y eventos de redimensionamiento de ventana
- Integración nativa con el portapapeles del sistema: en Windows/macOS funciona de inmediato, y en entornos remotos por SSH también permite copiar/pegar mediante X11 forwarding u códigos de escape OSC 52
- El código fuente original de Turbo Vision de la época de Borland C++ se puede compilar prácticamente tal cual, con modificaciones mínimas
- Soporta sistema de compilación CMake; con vcpkg, basta una línea
./vcpkg install tvisionpara instalarlo, y si se agregaadd_subdirectorycomo submódulo de CMake, enlaza las dependencias automáticamente - Requiere C++14 o superior y libncursesw / licencia MIT
1 comentarios
Opiniones de Hacker News
Me da mucho gusto ver que este repositorio llegó a la portada, y justo ahora estoy haciendo mi propio wrapper para este repositorio
Estoy ejecutando Turbo Vision sobre .Net en macOS y se siente bastante mágico
Estoy agregando una API de más alto nivel, además de envolver o mejorar la API de palette, que ya está bastante anticuada, y también estoy añadiendo layout
Todavía estoy trabajando duro en un repositorio privado, y sigo puliéndolo poco a poco, como hoy ajustando la palette según la surface donde están colocados los controles y mañana afinando otra parte
También me quedan pendientes cosas como ordenar el layout y agregar controles básicos que hoy en día se echan de menos
Antes probé Terminal.Gui, pero como estaba en plena transición a v2, fue bastante difícil usarlo sin bugs, y Claude también mostró muy bien qué no se debe hacer cuando se crea una librería TUI sin tomar en cuenta un terminal real
Así que justo estaba pensando que estaría bien tener una versión moderna de Turbo Vision, y entonces encontré este repositorio; ver que incluso incluye soporte para Unicode me hizo sentir muy agradecido
https://www.remobjects.com/elements/oxygene/
https://www.remobjects.com/elements/
Yo también estoy haciendo un wrapper para .NET, y aunque probablemente voy menos avanzado, quiero imitar lo más posible la API de Windows Forms e incluso meterle un diseñador TUI drag-and-drop
Hay un ejemplo aquí: https://github.com/brianluft/terminalforms/tree/main/src/TerminalFormsDemo
La mayor parte de la integración complicada del lado de C++ la resolví aquí: https://github.com/brianluft/terminalforms/tree/main/src/tfcore
Exporté funciones C simples para poder llamarlas con P/Invoke, y del lado de C# me concentré sobre todo en estructurar las clases
Al principio insistí en que todo lo que se pudiera hacer en C++ también se pudiera hacer en C#, pero se volvió demasiado complejo; incluso llegué al punto de meter objetos C++ dentro de buffers de C# usando placement new, prácticamente como si estuviera heredando clases de C++ desde C#, y ahí el diseño se vino abajo
Al final cambié a un enfoque más directo, menos flexible pero mucho más simple, y decidí dejar la flexibilidad del lado de C#
Me da curiosidad cómo armaste tu sistema de P/Invoke
Gracias a eso creo que he evitado intentos inútiles como ponerme a hacer apps para GEOS o unirme al equipo unipersonal de Hurd
Sí probé Terminal.Gui, pero TV me atraía más, así que también había pensado en hacer un wrapper; de verdad me gustaría verlo cuando sea público
Mi carrera de programación empezó literalmente en la basura en los 90
Encontré un libro de Turbo Vision que alguien había tirado, y me enamoré de inmediato de esa TUI azulada que cualquiera podía hacer
La versión original venía en Turbo Pascal 6, y el port a C++ salió después
Así que esto vendría siendo un port moderno de un port
Borland hacía algo parecido con otros frameworks: OWL también empezó primero del lado de Turbo Pascal for Windows 1.5, y buena parte de las herramientas de C++ Builder en realidad estaban hechas en Delphi
Object Pascal de Turbo Pascal 5.5, y luego Turbo Vision en la 6, fueron mi entrada a la POO, y siento que tuve suerte de empezar por ahí
Incluso en un entorno como MS-DOS, OOP y Turbo Vision te enseñaban muy bien las ventajas de un framework
Cuando Borland sacó Turbo Pascal, Turbo C++ y TurboVision, sentí que de pronto se abría todo un universo de posibilidades
El rendimiento de los compiladores era excelente y los manuales parecían obras de arte; ojalá todavía conservara esos libros
Esto es puro tesoro cultural
A inicios de los 90 aprendí C/C++ casi por mi cuenta leyendo nada más la pila de libros de Borland que venían con Turbo C++, y hoy cuesta hasta imaginar una escena donde alguien aprenda así solo con libros de referencia
Los frameworks TUI nuevos siempre se sentían como si les faltara algo, y ahora voy a volver a usar esto para ver si era simple nostalgia o no
Pienso meterlo en mi próxima herramienta, y de verdad quiero aplaudir mucho a quienes lo hicieron
Fuera de GW-BASIC y MS-DOS, todo era Borland: Turbo BASIC, Turbo Pascal, Turbo C++ para MS-DOS y Windows 3.x, Turbo Vision y OWL
Empecé a usar VC++ como por la versión 5, pero MFC siempre me pareció demasiado insípido comparado con los productos de Borland
Incluso hoy, pocas cosas igualan de verdad la capacidad RAD de C++ Builder, y a .NET le tomó bastante tiempo ordenar una historia comparable para el código de bajo nivel y AOT al estilo Delphi
Yo sí les pondría unas cuantas copias de Turbo Pascal 7 para MS-DOS y Delphi moderno en las manos a desarrolladores de Go, C++ y Rust
Turbo Vision 2.0 sigue siendo bastante práctico incluso hoy, tanto que yo mismo lo usé para un prototipo hace un año
Intenté hacer un frontend de Turbo Vision para el depurador LLDB, para que funcionara como el Turbo Debugger de Borland, y en su mayor parte salió como quería
Me sorprendió sentir que retomaba exactamente donde todo se había quedado en 199x, y hasta pude compilar y ejecutar código de 1993 sin mayores problemas
También hay una versión mejorada del editor interno basada en Scintilla, con funciones como syntax highlighting, pero la parte que yo quería modificar no me salió bien, así que probablemente tendré que pedir ayuda al autor
Eso sí, falta documentación en el sentido moderno de conocimiento compartido, así que no es fácil preguntarle a Stack Overflow o a una IA; me tocó aprender viendo ejemplos y releyendo varias veces algunos libros de Turbo Vision, a la vieja usanza
El layout manual es bastante tedioso, así que estaría bien tener algo como el layout automático de Qt, y también extraño un poco los splitters, aunque no parecen difíciles de implementar
Otra cosa que me sorprendió es que TV en realidad es bastante pequeño y compacto. En los 90 se sentía gigantesco
En general, el trabajo de modernización está muy bien hecho, y a mí me gusta muchísimo
Turbo Vision originalmente sí tenía muchísima documentación de gran calidad
De hecho, creo que la que anda escasa es la parte moderna
https://archive.org/details/bitsavers_borlandTurrogrammingGuide1992_25707423
Ver tantas directivas de cmake me da ganas de volver al pasado
En Turbo C o Pascal solo presionabas F9 y corría de inmediato
Por otro lado, también siento que esto muestra la incompetencia de nuestra cadena de herramientas
A estas alturas debería bastar con señalar un compilador en línea para ejecutarlo al instante, o descargarlo, abrir una carpeta y correrlo; pero se volvió más un ritual que una herramienta
./configure && make && make install debería seguir siendo el estándar de oro
Este es solo uno de los ports/clones de Turbo Vision
Del lado de C++ también está este: https://github.com/kloczek/tvision
La versión incluida en FreePascal/Lazarus está escrita en Pascal, y también hay una en Rust que se ve medio vibe-coded: https://github.com/aovestdipaperino/turbo-vision-4-rust
Si corres esto en una terminal, se pierde un poco la sensación clave que daba el mouse en una pantalla de modo texto
En una pantalla real de modo texto no se veía como un puntero de mouse, sino más bien como un bloque amarillo movido con el mouse
Me pregunto si alguien lo ha probado en modo texto real de Linux de alta resolución con GPM
Se mostraba invirtiendo el color de la celda que quedaba debajo, y como la ventana principal que llenaba casi toda la pantalla solía ser azul oscuro, muchas veces el resultado sí parecía un bloque amarillo brillante
Recomiendo un episodio reciente del podcast de Wookash sobre Chuck Jazdzewski
Fue parte del equipo que creó Turbo Vision originalmente, y también hablan bastante de todo ese ecosistema
Yo todavía prefiero el verdadero Turbo Vision, o sea la versión en Pascal, sobre la de C++
La de C++ al final se siente más como una traslación de la de Pascal
Por ejemplo, en Pascal
useses una palabra clave, mientras que incluir módulos con#definese siente más como un hackBueno, quizá hoy ya no sea una diferencia tan importante
El IDE en modo texto también usa Free Vision
https://wiki.lazarus.freepascal.org/images/1/19/Userscreen.png
Pero la diferencia clave es que Free Vision y Turbo Vision usan el tipo
objectde Turbo Pascal 5.5, noclassde DelphiCon
classes fácil implementar cosas como serialización automática gracias a RTTI, peroobjectno tiene eso, así que para distinguir tipos distintos en tiempo de ejecución hay que hacer serialización manual, por ejemplo registrando el puntero VMT que está en un offset fijo dentro del puntero al objetoFree Pascal sí le añadió a
objectalgunas comodidades como private/protected/public y property, pero Free Vision no usa esas extensiones porque implementa la API original de Turbo Vision