9 points par GN⁺ 3 일 전 | 1 commentaires | Partager sur WhatsApp
  • 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é terminalle 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 simple moveStr() suffit pour gérer automatiquement le défilement et la troncature multioctets
  • En s’appuyant sur la prise en charge de setlocale UTF-8 dans Microsoft RTL, du code comme std::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 tvision via vcpkg, et ajout possible comme sous-module CMake avec add_subdirectory pour lier automatiquement les dépendances
  • C++14 ou supérieur, nécessite libncursesw / licence MIT

1 commentaires

 
GN⁺ 3 일 전
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

    • Oxygene fait partie de la gamme Elements de RemObjects, donc en plus du langage Pascal Oxygene, on peut mélanger plusieurs langages populaires et cibler Windows, macOS, Linux, Android, etc.
      https://www.remobjects.com/elements/oxygene/
      https://www.remobjects.com/elements/
    • J’ai moi aussi travaillé avec ce port de tvision, et chaque fois que je touche à un nouveau framework TUI, je finis par trouver Turbo Vision meilleur
      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
    • Travailler avec cette bibliothèque TV réveille vraiment la nostalgie, et c’est un plaisir
      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’aurais aimé faire exactement la même chose
      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

    • Ce qui est amusant, c’est que Free Vision est le résultat d’une retraduction manuelle vers Object/Free Pascal d’une version C++ qui avait un temps été placée dans le domaine public
    • OWL était vraiment en avance sur son temps
  • 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

    • Ces manuels étaient vraiment extraordinaires
      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
    • Turbo Vision a longtemps été pour moi une sorte de référence absolue
      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
    • Il y a eu une époque où j’étais 100 % Borland
      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

  • 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

    • Compiler un logiciel sur un Unix moderne a déjà été un problème résolu à une époque
      ./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

    • En réalité, ce n’était pas intrinsèquement jaune
      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, uses est un mot-clé, alors que la manière d’inclure des modules via #define ressemble malgré tout à un bricolage
    Bon, aujourd’hui la différence n’est peut-être plus si importante

    • Free Vision, inclus dans Free Pascal, remplit en pratique ce rôle
      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 object de l’époque de Turbo Pascal 5.5, et non la class de Delphi
      Avec class, grâce à la RTTI, il est facile d’implémenter des choses comme la sérialisation automatique, alors qu’avec object, 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’objet
      Free Pascal a bien ajouté à object quelques 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