Turbo Vision 2.0 - Recréer l’interface texte des années 90
(github.com/magiblot)- Port open source modernisé du framework d’interface texte de Borland des années 90, désormais multiplateforme + Unicode
- Lors de la création d’applications terminal, inutile de gérer soi-même la compatibilité terminal — le même code fonctionne sur Linux, Windows et DOS
- Des widgets TUI comme des fenêtres superposables redimensionnables, menus déroulants, boîtes de dialogue, boutons, barres de défilement, champs de saisie, cases à cocher et boutons radio sont déjà intégrés, donc pas besoin de les implémenter soi-même
- Prise en charge complète de l’Unicode UTF-8 — tout en conservant l’API existante basée sur
char, le framework gère les caractères CJK pleine chasse, les caractères combinés et même les émojis, et un simplemoveStr()suffit pour gérer automatiquement le défilement et la troncature multioctets - En s’appuyant sur la prise en charge de
setlocaleUTF-8 dans Microsoft RTL, du code commestd::ifstream f("コンピュータ.txt")fonctionne tel quel sous Windows - Support de la true color 24 bits — au-delà des 16 couleurs historiques, prise en charge de RGB, xterm-256 et des couleurs par défaut du terminal ; si le terminal ne les supporte pas, la couleur la plus proche est automatiquement quantifiée
- Prise en charge de toutes les E/S modernes : molette de souris, bouton du milieu, triple-clic, taille d’écran jusqu’à 32767 lignes/colonnes, événements de redimensionnement de fenêtre, etc.
- Intégration native du presse-papiers système : fonctionne immédiatement sous Windows/macOS et, même en environnement distant SSH, le copier-coller reste possible via le forwarding X11 ou les codes d’échappement OSC 52
- Le code source Turbo Vision de l’époque Borland C++ peut toujours être compilé tel quel avec un minimum de modifications
- Prise en charge du système de build CMake ; installation en une ligne avec
./vcpkg install tvisionvia vcpkg, et ajout possible comme sous-module CMake avecadd_subdirectorypour lier automatiquement les dépendances - C++14 ou supérieur, nécessite libncursesw / licence MIT
1 commentaires
Commentaires Hacker News
Je suis vraiment ravi de voir ce dépôt arriver en page d’accueil, et je suis justement en train de créer mon propre wrapper pour ce dépôt
Je fais tourner Turbo Vision sur macOS au-dessus de .Net, et ça donne une impression assez magique
Je fournis une API de plus haut niveau, j’encapsule ou j’améliore aussi la palette API qui fait assez datée, et j’ajoute du layout
Pour l’instant, tout est encore en plein chantier dans un dépôt privé, et je continue à peaufiner morceau par morceau, un jour en fixant la palette selon la surface où les contrôles sont placés, le lendemain en retouchant autre chose
Il me reste aussi à remettre de l’ordre dans le layout et à ajouter des contrôles de base qui manquent selon les standards actuels
J’ai aussi essayé Terminal.Gui auparavant, mais avec la transition vers la v2, c’était assez difficile à utiliser sans bugs, et Claude a aussi très bien montré ce qu’il ne faut pas faire quand on crée une bibliothèque TUI sans tenir compte d’un vrai terminal
Du coup, je me disais qu’une version moderne de Turbo Vision serait idéale, puis je suis tombé sur ce dépôt, et j’ai été vraiment reconnaissant de voir qu’il prenait même en charge Unicode
https://www.remobjects.com/elements/oxygene/
https://www.remobjects.com/elements/
Je construis également un wrapper .NET, probablement moins avancé, mais j’aimerais aller jusqu’à intégrer un designer TUI en drag-and-drop tout en imitant au maximum l’API de Windows Forms
Il y a un exemple ici : https://github.com/brianluft/terminalforms/tree/main/src/TerminalFormsDemo
L’essentiel du travail d’intégration délicat côté C++ a été fait ici : https://github.com/brianluft/terminalforms/tree/main/src/tfcore
J’ai exporté des fonctions C simples pour pouvoir les appeler via P/Invoke, et côté C#, je me suis surtout concentré sur la structuration des classes
Au début, j’insistais pour que tout ce qui était possible en C++ le soit aussi en C#, mais c’est devenu beaucoup trop complexe, et j’en suis même arrivé à utiliser placement new pour mettre des objets C++ dans des buffers C#, au point de frôler une sorte d’héritage de classes C++ depuis C#, puis toute la conception s’est effondrée
J’ai fini par passer à une approche bien plus directe, moins flexible mais beaucoup plus simple, en gardant la flexibilité côté C#
Je serais curieux de savoir comment vous avez organisé votre système P/Invoke
Grâce à elle, j’ai l’impression d’éviter des tentatives absurdes du genre faire des applications pour GEOS ou rejoindre l’équipe Hurd à une seule personne
J’ai bien essayé Terminal.Gui, mais TV m’attirait davantage, donc j’avais envisagé un wrapper, et j’aimerais vraiment le voir si vous le publiez
Ma carrière de programmeur a littéralement commencé dans une poubelle dans les années 90
Quelqu’un avait jeté un livre sur Turbo Vision, je l’ai ramassé, et je suis immédiatement tombé amoureux de ces TUI bleutées que n’importe qui pouvait créer
La version d’origine était fournie avec Turbo Pascal 6, et le port C++ est arrivé plus tard
On peut donc voir ceci comme un port moderne d’un port
Borland avait une logique similaire avec d’autres frameworks : OWL aussi était d’abord du côté de Turbo Pascal for Windows 1.5, et une bonne partie des outils de C++ Builder étaient en réalité écrits en Delphi
L’Object Pascal de Turbo Pascal 5.5, puis Turbo Vision dans la version 6, ont été mon introduction à la POO, et j’ai le sentiment d’avoir eu beaucoup de chance de démarrer par là
Même dans un environnement comme MS-DOS, on pouvait vraiment apprendre les avantages de la POO et d’un framework comme Turbo Vision
Quand Borland a sorti Turbo Pascal, Turbo C++, et TurboVision, j’ai eu l’impression qu’un univers de possibilités s’ouvrait d’un coup
Les compilateurs étaient excellents et les manuels ressemblaient à des œuvres d’art ; j’aimerais encore avoir ces livres aujourd’hui
C’est tout simplement un trésor culturel
Au début des années 90, j’ai presque tout appris en C/C++ en autodidacte, simplement en lisant la pile de livres Borland fournie avec Turbo C++, et aujourd’hui il est difficile d’imaginer apprendre ainsi uniquement avec des ouvrages de référence
Les nouveaux frameworks TUI donnaient toujours l’impression qu’il leur manquait quelque chose, et maintenant je vais pouvoir le réutiliser pour vérifier si ce n’était que de la nostalgie
Je compte l’intégrer à mon prochain outil, et j’aimerais vraiment applaudir chaleureusement ses auteurs
En dehors de GW-BASIC et de MS-DOS, tout venait de Borland : Turbo BASIC, Turbo Pascal, Turbo C++ pour MS-DOS et Windows 3.x, Turbo Vision, OWL
Je ne suis passé à VC++ qu’autour de la version 5, et MFC m’a toujours semblé terriblement fade comparé aux produits Borland
Même aujourd’hui, rares sont les outils qui égalent vraiment les capacités RAD de C++ Builder, et même .NET a mis longtemps à clarifier son histoire autour du code bas niveau et de l’AOT à la Delphi
À mon avis, il faudrait mettre entre les mains des développeurs Go, C++ et Rust quelques exemplaires de Turbo Pascal 7 pour MS-DOS et de Delphi moderne
Turbo Vision 2.0 reste encore assez pratique aujourd’hui, au point que je l’ai utilisé directement pour un prototype il y a un an
J’essayais de créer un frontend Turbo Vision pour le débogueur LLDB afin qu’il fonctionne comme le Turbo Debugger de Borland, et dans l’ensemble cela s’est passé comme prévu
C’était surprenant, comme si le projet reprenait exactement là où 199x s’était arrêté, et j’ai même pu compiler et exécuter du code de 1993 sans gros problème
Il existe aussi une meilleure version de l’éditeur interne, basée sur Scintilla, avec des fonctions comme la coloration syntaxique, mais les modifications que je voulais y apporter ne se sont pas bien passées, donc je vais sans doute devoir demander de l’aide à l’auteur
En revanche, la documentation manque au sens moderne de savoir partagé, donc difficile de demander sur Stack Overflow ou à une IA ; il a fallu revenir à l’ancienne méthode, apprendre en lisant le code d’exemple et relire plusieurs livres sur Turbo Vision
Le layout manuel est assez fastidieux, donc un layout automatique à la Qt serait appréciable, et les splitter me manquent aussi un peu, même si leur implémentation ne semble pas difficile
Une autre chose qui m’a surpris, c’est que TV est en réalité assez petit et compact. Dans les années 90, ça me semblait énorme
Globalement, le travail de modernisation est vraiment excellent, et j’aime beaucoup ce projet
Turbo Vision fournissait à l’origine une énorme quantité de documentation de grande qualité
C’est plutôt le monde actuel qui me semble en manquer
https://archive.org/details/bitsavers_borlandTurrogrammingGuide1992_25707423
Voir tous ces directives cmake me donne presque envie de revenir en arrière
Avec Turbo C ou Pascal, il suffisait d’appuyer sur F9 pour lancer le programme
D’une certaine manière, j’y vois aussi la démonstration de l’incompétence de notre chaîne d’outils
À notre époque, on devrait pouvoir soit pointer vers un compilateur en ligne et exécuter directement, soit télécharger, ouvrir un dossier et lancer ; à la place, c’est devenu une sorte de rituel plutôt qu’un outil
./configure && make && make install devrait toujours rester le gold standard
Ce n’est qu’un des ports/clones de Turbo Vision
Côté C++, il y a aussi ceci : https://github.com/kloczek/tvision
La version incluse dans FreePascal/Lazarus est écrite en Pascal, et il existe aussi une version Rust qui a un petit côté vibe-coded : https://github.com/aovestdipaperino/turbo-vision-4-rust
Quand on exécute ça dans un terminal, on perd un peu la sensation essentielle qu’apportait à l’origine la souris en mode texte
Sur un vrai écran en mode texte, elle ne ressemblait pas à un pointeur, mais plutôt à un bloc jaune déplacé à la souris
Je me demande si quelqu’un a essayé ça en mode texte Linux haute résolution avec GPM
Le système inversait simplement les couleurs de la cellule recouverte, et comme la fenêtre principale qui remplissait la plus grande partie de l’écran était souvent d’un bleu foncé, le résultat donnait fréquemment l’impression d’un bloc jaune vif
Je recommande l’épisode récent du podcast Wookash consacré à Chuck Jazdzewski
Il faisait partie de l’équipe qui a créé Turbo Vision à l’origine, et l’épisode parle aussi beaucoup de tout cet écosystème
Je préfère encore au C++ la vraie Turbo Vision, c’est-à-dire la version Pascal
La version C++ me donne au fond l’impression d’être surtout une transposition de la version Pascal
Par exemple, en Pascal,
usesest un mot-clé, alors que la manière d’inclure des modules via#defineressemble malgré tout à un bricolageBon, aujourd’hui la différence n’est peut-être plus si importante
L’IDE en mode texte utilise lui aussi Free Vision
https://wiki.lazarus.freepascal.org/images/1/19/Userscreen.png
La différence essentielle, toutefois, est que Free Vision et Turbo Vision utilisent le type
objectde l’époque de Turbo Pascal 5.5, et non laclassde DelphiAvec
class, grâce à la RTTI, il est facile d’implémenter des choses comme la sérialisation automatique, alors qu’avecobject, il n’y a rien de tel ; pour distinguer différents types à l’exécution, il faut faire de la sérialisation manuelle, par exemple en enregistrant le pointeur VMT situé à un offset fixe dans le pointeur d’objetFree Pascal a bien ajouté à
objectquelques commodités comme private/protected/public et property, mais Free Vision n’utilise pas ces extensions, car il implémente avant tout l’API d’origine de Turbo Vision