fxcgIO : une librairie pour applications en mode console (a.k.a. terminal)
Posté le 03/02/2026 22:04
Hello,
cela faisait un bon moment que je voulais développer une librairie pour permettre de faire des applications simples en mode console (ie. dans un terminal). L'idée s'est renforcée lorsque
Lephenixnoir a
permis la redirection des flux standards stdin/stdout/stderr en C (et leurs correspondant cin/ceout/cerr en C++) avec gint et la fxlibc.
La librairie permet de faire tout simplement des programmes utilisant la syntaxe de base du C avec printf()/scanf() ou cout/cin en C++. La librairie se chargeant de gérer les flux, d'afficher dans un terminal.
Accessoirement, le terminal gère partiellement les Control Sequence de base VT100 (les escape codes permettant de coloriser le texte). Il faudra que je complète au fur et à mesure, mais la base est là. Il y a aussi un mode "game" pour les mordus qui voudrait faire des jeux en ASCII art. Il faudra implémenter quelques jolies fontes.
Voici quelques exemples de screenshots issus des nombreux programmes de tests :
Le projet est géré par giteapc pour l'installation et la configuration :
giteapc install Slyvtt/fxcgIO
ensuite dans votre projet au niveau du fichier CMakeLists.txt, il vous suffit de faire un find_package(fxCGIO 0.1 REQUIRED)
et ne pas oublier d'include la librairie target_link_libraries(myaddin fxCGIO::fxCGIO Gint::Gint) si vous êtes en C
ou bien target_link_libraries(myaddin fxCGIO::fxCGIO Gint::Gint -lstdc++) si vous êtes en C++
Un petit programme d'exemple en C :
#include <fxCGIO/fxCGIO.h>
#include <stdio.h>
int main(void)
{
fxCGIO_init();
printf("=== Test ANSI fxCGIO ===\n\n");
printf("Texte normal\n");
printf("\x1b[31mRouge\x1b[0m ");
printf("\x1b[32mVert\x1b[0m ");
printf("\x1b[33mJaune\x1b[0m ");
printf("\x1b[34mBleu\x1b[0m ");
printf("\x1b[35mMagenta\x1b[0m ");
printf("\x1b[36mCyan\x1b[0m ");
printf("\x1b[37mBlanc\x1b[0m\n\n");
printf("Couleurs de fond :\n");
printf("\x1b[30;47m Noir sur Blanc \x1b[0m\n");
printf("\x1b[31;40m Rouge sur Noir \x1b[0m\n");
printf("\x1b[32;44m Vert sur Bleu \x1b[0m\n");
printf("\x1b[33;45m Jaune sur Magenta \x1b[0m\n\n");
printf("Test positionnement curseur (10,5)\n");
printf("\x1b[5;10HICI\n");
printf("\nTest clear écran dans 2 secondes...\n");
/* petite boucle d’attente grossière */
for(volatile int i = 0; i < 20000000; i++);
printf("\x1b[2J");
printf("Ecran efface.\n");
printf("\x1b[10;5HFin du test.\n");
getchar();
fxCGIO_free();
return 0;
}
et en C++
#include <fxCGIO/fxCGIO.hpp>
#include <cstdio>
using namespace fxCGIO;
int main()
{
fxCGIO::init();
cout << "=== Test ANSI fxCGIO (C++) ===\n\n";
cout << "Texte normal\n";
cout << "\x1b[31mRouge\x1b[0m ";
cout << "\x1b[32mVert\x1b[0m ";
cout << "\x1b[33mJaune\x1b[0m ";
cout << "\x1b[34mBleu\x1b[0m ";
cout << "\x1b[35mMagenta\x1b[0m ";
cout << "\x1b[36mCyan\x1b[0m ";
cout << "\x1b[37mBlanc\x1b[0m\n\n";
cout << "Couleurs de fond :\n";
cout << "\x1b[30;47m Noir sur Blanc \x1b[0m\n";
cout << "\x1b[31;40m Rouge sur Noir \x1b[0m\n";
cout << "\x1b[32;44m Vert sur Bleu \x1b[0m\n";
cout << "\x1b[33;45m Jaune sur Magenta \x1b[0m\n\n";
cout << "Test positionnement curseur (20,8)\n";
cout << "\x1b[8;20HCOUCOU\n";
cout << "\nClear écran dans 2 secondes...\n";
for(volatile int i = 0; i < 20000000; i++);
cout << "\x1b[2J";
cout << "Ecran efface.\n";
cout << "\x1b[12;10HFin du test C++.\n";
getchar();
fxCGIO::clear();
fxCGIO::free();
return 0;
}
Je continue de debugger/ajouter des features et des programmes exemples. Le projet est accessible ici :
https://git.planet-casio.com/Slyvtt/fxcgIO sur la forge Planète Casio
N'hésitez pas à me dire si vous trouvez des bugs (il doit y en avoir, car c'est dur de tout tester).
Il reste encore pas mal de choses à faire :
- une keymap complète pour prizm
- la variante pour la math+
- un support plus complet des codes VT100 et +
- une API avancée pour le mode game
- une fonte 256char en 5x7 pixels pour avoir plus de caractères
- la gestion des fontes dynamiquement (recalcul de l’écran lorsque l'on change de police de caractères)
- support des fontes unicodes ???
- une librairie simple ncurses-like pour faire des interfaces TUI
- support du Classpad et des fx9860G
- éventuellement des drivers input/output (fichiers / USB / COM (serial) / etc...), logiquement l'interfaçage des flux est suffisamment générique pour que ça se fasse relativement facilement.
Bref, plein d'idées, surement trop pour le temps disponible de votre humble serviteur.
Amusez vous bien.
Sly
@RDP à l'occasion
Citer : Posté le 03/02/2026 23:07 | #
Nice ! Je me demande si on pourrait pas utiliser ça pour faire un type d'add-in "port de programme terminal" où le code pourrait être réutilisé entièrement de programmes existants.
Citer : Posté le 03/02/2026 23:26 | #
C'est l'idée de base. Avoir la possibilité à terme de pouvoir utiliser un programme pc terminal sans changement majeur pour que ça tourne sur fxcg.