ncurses et wasm

a marqué ce sujet comme résolu.

Bonjour,

Je cherche à compiler un programme utilisant ncurses vers un environnement type navigateur.

Voilà un exemple de programme:

#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>


const char* clem_happy = 
"                                                                   ,lc                            \n"
"                                                                .:xkdo.                           \n"
"                                                               :xkkdoo,                           \n"
"                                                             'dkkkxoooc                           \n"
"                                                           .okkkkxooodd                           \n"
"                         ;l,.                             ;xkkxkxdooddd.                          \n"
"                         lxxkxc'                        .okkkkkxxoodddd.                          \n"
"                         ,xxxkxkxl,                    'xkkkkxkxooddddx.                          \n"
"                         .xxxxxkkkkxl.                ,xkkkkxkxdoddddxx.                          \n"
"                          cxxxxxkxkkkkd,             ,kkkkxkxkdoddddxxx                           \n"
"                          .ddxxxxxkxkkkkx;          .xkkkkkxkxoddddxxxc                           \n"
"                           cdddxxxxxkxkkkkx,        dkkkkkkkxoddddxxxx.                           \n"
"                           .oddddxxxkxkkkkkkl      'kkkkxkxkdddddxxxko                            \n"
"                            'odddddxxxxxkkkkkd.    ckkkkkxkdddddxxxxx.                            \n"
"                             :oodddddxxkxkkkkkd    okkkxkkxddddxxxkx'                             \n"
"                              :ooddddddxxkxkkkkl   dkkkkxxddddxxxkx'                              \n"
"                               ;oooddddddxxkxkkk'  okkxkkdddxxxxkd.                               \n"
"                                .looodddddxxxkkko  ckxkxxddxxxxx;                                 \n"
"                                  'loooddddxxxkkk. ,kkxxddxxxxl.                                  \n"
"                                    'coooddddxkxk'  xkxddxxxl.                                    \n"
"                                      .,loodddxxk;  :xddxd:.                                      \n"
"                                         .':odddx;   ddc.                                         \n"
"                                             .';l:,;.c                                            \n"
"                                               ..cdxd.                                            \n"
"                                       ..';;;;;;;:oxl::;;,'..                                     \n"
"                                   .';;;;;;;;;;;:lldol:;;;;;;;,.                                  \n"
"                                 ';;;;;;;;;;,,,,;;:c:;;,;;;;;;;;;.                                \n"
"                               ';;;;;;;;,,,,,,,,,,,,,,,,,,,,;;;;;;;.                              \n"
"                              ,;;;;;;;;;;;,,,,,,,,,,,,,,,,;;;;;;;;;;'                             \n"
"                             ;;;;;;;;,,,,,,'''''''''''''',,,,,,;;;;;;,                            \n"
"                            ,;;;;;;,,,,,,'''''''''''''''''',,,,,,,;;;;'                           \n"
"                           .;;;;;;,,;c:,'''''''......'''''':c',,,,,;;;;.                          \n"
"                           ';;;;;,,l0Kxdd''''...........',OK0oO;,,,;;;;'                          \n"
"                           ;;;;;;,,lk,OKx'''............',O':KO;,,,;;;;;                          \n"
"                           ;;::;;,,,;ll:''''............''':c:,,,,;:;;;;.                         \n"
"                           ;:cll;;,,codoc''''..........''':odo:,,;:cl:;;.                         \n"
"                           '::::;;,xXXKKK0xl:,''....',:lx0KKKXXx,,;::;;;                          \n"
"                            ;;;;;;;0XKKKKKKK000OkkkO00KKKKKKKXXO,;;;;;;,                          \n"
"                            .:;;;;;dXKKKKKKK00000000000KKKKKKKXo;;;;;;;.                          \n"
"                             '::;;;;OKKKKKKK00000000000KKKKKKKx;;;;;;:.                           \n"
"                              .::::::xKKKKKKK000000000KKKKKKKd;::::::.                            \n"
"                               .:ccc::lkKKK000OO0000000KKKKxc:::ccc;                              \n"
"                                 .:lcccccdxkOOkkkkkkOOOkxoccccccc;.                               \n"
"                                   .;llllllcclooooooolccllllllc'                                  \n"
"                                      .,clooooooooooooooool;'.                                    \n"
"                                          .',;;::::::;,'..                                        \n";


const char* clem_sad = 
"                                                      'o:                                         \n"
"                                                     okxo;                                        \n"
"                                                   .dkxdoo,                                       \n"
"                                                  .dkkkdooo.                                      \n"
"                               .                 .xkkkxooodl                                      \n"
"                               dxl'             .xkkkxxooodd,                                     \n"
"                              .xxxkx:.          dkkkxkxoodddd                                     \n"
"                              .xxxxxkxl.       okkkkkxdoddddx,                                    \n"
"                              .xxxxxxkkko.    :kkkxkxxdodddxxl                                    \n"
"                               dxxxxxkxkkkl. .xkkkkxkxdddddxxx                                    \n"
"                               oddxxxxkkkkkx:lkkkkxkxxddddxxxx.                                   \n"
"                               :dddxxxxxkxkkkkkkkkkxxxddddxxxk.                                   \n"
"                               .dddddxxxxkkkkkkkxkxkkddddxxxxk.                                   \n"
"                                loddddxxxkxkkkkkkxkkxddddxxxkd                                    \n"
"                                'ooddddxxxkxkkkkkkxxxdddxxxxk,                                    \n"
"                                 coodddddxxkkkkkkkkkxdddxxxko                                     \n"
"                                  loodddddxkxkxkkkkxxddxxxxx.                                     \n"
"                                   coooddddxxkkkkkkxxddxxxx.                                      \n"
"                                    ,oooddddxxkxkkkxddxxxx.                                       \n"
"                                     .cooodddxxkkkxxddxxo.                                        \n"
"                                       .coodddxkxkkxdxx:                                          \n"
"                                         .;ooddxkkxxdo.                                           \n"
"                                            .cddxl:d'                                             \n"
"                                               .coo,                                              \n"
"                                           ......oxl...                                           \n"
"                                     ..';;;;;;;;:cxoc:;;;;,..                                     \n"
"                                  .,;;;;;;;;;;;;ccool:;;;;;;;;'.                                  \n"
"                                ';;;;;;;;;,,,,,,;;;;;,,,,;;;;;;;,.                                \n"
"                              .;;;;;;;,,,,,,,,,,,,,,,,,,;:c;,;;;;;'                               \n"
"                             ';;;;;;,,,,,,,,,''''''''',,lll;,,,;;;;,                              \n"
"                            ';;;;;;;,,,,,,'''''''''''''',,,,,,;,;;;;;                             \n"
"                           .;;;;;;,,,;,,''''''''''''''''''',,,,,,;;;;,                            \n"
"                           ,;;;;;,,,;'',;''''.........''';,'';,,,,;;;;.                           \n"
"                           ;;;;;;,,:.   ,;,'..........',,,   .;,,,,;;;,                           \n"
"                          .;;;;;,,,,,..',''.............',...,,,,,,;;;;                           \n"
"                          .;;;;;;,,,,,,'''''...........'''',',,,,,;;;;;.                          \n"
"                           ;;;;;;,,,,,,''''''.........'''''',,,,,,;;;;;.                          \n"
"                           ,;;;;;;,,,,,,''''''''''''''''''',,,,,,;;;;;;                           \n"
"                           .:;;;;;;,,,,...........'''''',,,,,,,,;;;;;;.                           \n"
"                            .:;;;;;;,,.                    .,,,;;;;;;,                            \n"
"                             '::::;;;;.                    .;;;;;:::;                             \n"
"                              .:::::::'.....................::::::c,                              \n"
"                                ,ccccccc:::::::::::::::::::cccccc;.                               \n"
"                                  'cllllcccccccccccccccccccllll;.                                 \n"
"                                    .;llllllllllllllllllllll;.                                    \n"
"                                       .';:cloooooooolc:;'.                                       \n"
"                                             ........                                             \n";

int main(void) {
    /*  Initialize ncurses  */
    initscr();
    noecho();
    cbreak();
    keypad(NULL, 0);
    intrflush(NULL, 0);
    curs_set(0);
    printw("%s", clem_happy);

    int c;
    while ( (c = getch()) != 'q' )
        switch ( c ) {

        case 'A':
        case 'D':
            refresh();
            move(0,0);
            printw("%s", clem_happy);
            break;

        case 'B':
        case 'C':
            refresh();
            move(0,0);
            printw("%s", clem_sad);
            break;
        }


    refresh();

    return EXIT_SUCCESS;
}

Savez-vous si c’est faisable ? Comment je dois me débrouiller ? J’ai essayé mais je n’ai pour l’instant rien de concluant, il me manques quelque chose ?

Merci !

PS: J’ai oublié de préciser l’erreur !

"Error opening terminal: emsc."

Lorsque de l’exécution du programme. :(

Je compile comme ça:

emcc t.c -s WASM=1  -o test.html -I ./ncurses-6.1/build/include/ -L ./ncurses-6.1/build/lib/ -lncurses

Bien-sûr, j’ai compiler ncurses également avec emscripten.

+0 -0

Bon du coup, j’ai réussi, il faut lié également /usr/share/terminfo mais le résultat n’a rien à voir avec ce que j’imaginais.

Je m’attendais à avoir comme le résultat de ttyd alors qu’au final rien ne marche. Même pas les séquences d’échappement ANSI (alors qu’elles devraient !).

J’ai envie d’abandonner. Le problème le plus problématique est que l’input ne se fait pas, à la place quand je tape mais à la place, j’ai un appel à prompt("Input :") qui du coup n’est pas du tout ce que je veux.

+0 -0

@HerbeQuiBenchEtSquat: En fait, je me rend compte que personne n’a jamais tenté en vrai. Ou si quelqu’un l’a fait. Il l’a pas vraiment documenté.

@entwanne: Depuis, si. Car du coup, je me suis rendu compte de ça et j’ai cru que c’était le problème. J’ai utilisé xterm.js. J’ai donc eux l’erreur "Error opening terminal: xterm.js." … Du coup xterm.js émule une bonne partie du terminal.

Bref, j’ai analysé la ligne de code qui affichait ça et en fait c’est ncurses. Qui n’arrive pas à lire le terminfo. Bref, c’est compliqué pour pas grand chose.

Au final, ça donne une interface à base de prompt() alors qu’on pourrait faire mieux.

Maintenant, je me rend compte que le problème est que JS est basiquement synchrone. Quand mon programme fait getch(), là, il met en pause le programme. Et c’est pour ça que emscripten utilise prompt(), car mettre en pause le programme, c’est mettre en pause la page ! Mais en vrai, je devrais utiliser un Worker JS pour avoir un second thread et faire patienter mon programme quand il fait getch(). ._. Pour ça, le mieux, je pense ça va être une communication à base de WebSocket entre les deux threads. 😂 On est dans l’abus d’utilisation de nouvelles technologies que je m’attendais pas à utiliser pour compiler du C; et qui me semble nécessaire pour ce projet.

Bref, ça fait TELLEMENT de chose à faire, je ne m’attendais pas à ce que ça soit si dur.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte