Capture de caractère

Bonjour,

Je voudrais savoir s'il était possible de capturer "en temps réel" la saisie d'une touche au clavier à l'aide d'une fonction en C, si possible standard.

En gros, ça marche comme pour le manuel. Il suffit de presser q pour le quitter par exemple.

Aussi, j'aurais la même requete pour cette fois redimensionner une fenêtre, celle du terminal. J'ai utilisé ncurses.h et resizeterm mais ça bug à la compilation...



Merci !

4 réponses

  1. Contributeur
    En standard il n'existe rien de tout ça.
    Apres cela depend de ton OS ?
    Et sil y a une erreur à la compil, cest que ton code est faux. Et pour le corriger, cest plus simple si tu nous le montres ;-)
    1. Salut,

      J'ai Fedora 17 et gcc en compilateur.

      Le code fait presque 1000 lignes :( mais en gros, ce qui plante c'est :


      #include <ncurses.h>

      (...)

      int main (int argc, char * argv[])
      {
      (...)
      int l = (...);
      int h = (...);
      resizeterm(l, h);
      (...)
      }

      GCC me renvoie :

      "/tmp/ccE0HnRh.o: In function 'main':
      blabla.c:(.text+0x19): undefined reference to 'resizeterm'
      collect2: erreur: ld a retourné 1 code d'état d'exécution"
      1. Contributeur
        Lorsque tu compiles, as-tu rajouté l'option -l (L minuscule) ?
        Il faut réaliser linker la bibliothèque libncurses : -lncurses (L minuscule).
      2. J'avais oublié... merci !

        Maintenant ça compile. Mais ça n'a aucune action.


        #include <ncurses.h>

        int main()
        {
        resizeterm(100,45);
        printf("blabla");
        return 0;
        }


        compile mais ne fait qu'imprimer blabla...
      3. Contributeur
        Je connais pas ncurses mais j'ai lu le man (il faut prendre cette habitude ;-)) :
        Et cela dit : change the curses terminal size
        Autrement cela ne changera pas ton terminal, mais celui de curses.
        Pour créer une fenêtre curses : WINDOW * win = newwin(nlines, ncols, y0, x0);

        Si tu veux vraiment redimensionner le terminal linux, tu dois pouvoir t'en sortir avec les fonctions de sys/ioctl.h mais pas aussi simple que resizeterm().
      4. Merci !

        Sinon, des idées pour la capture de caractère ?
        J'ai une idée (sale cela dit) pour la capture du caractère Entrée, mais pour le reste...
    2. Contributeur
      Salut Franck7511,

      Pour ton problème de redimensionnement de la fenêtre d'émulation de terminal dans laquelle s'exécute ton programme dans ton environnement graphique Fedora, je voulais juste de donner une autre perspective...

      J'imagine que tu utilises Gnome-terminal sous Fedora.

      Si c'est cela, une piste peut être là https://help.gnome.org/users/gnome-terminal/stable/pref-profiles.html.en c'est à dire la création d'un profil d'exécution de Gnome-terminal, avec les paramètres qui te plaisent (notamment la taille du terminal que tu souhaites) et le lancement du terminal avec ce profil, avec, en argument, ton programme console.

      Je n'ai pas de console Gnome sous la main pour tester cela, mais j'ai fait quelque chose de similaire sous Ubuntu il y a quelques temps.

      Dal
      1. Nope j'ai LXTerminal en fait. Et en fait il ne faut pas que je change de taille qu'une seule fois dans mon programme, mais plusieurs fois.

        Je m'explique.

        Je fais un démineur sur le terminal. Pour les grandes grilles, j'ai besoin d'agrandir la fenêtre... et vu qu'on peut rejouer, je dois pouvoir redimensionner !
    3. Contributeur
      Salut Franck7511,

      Je ne connais pas ton émulateur de terminal "LXTerminal".

      Cependant, il est possible qu'il reconnaisse les séquences d'échappement xterm.

      Il y en a de nombreuses, et parmi ces séquences, il y en a qui permettent d'agir sur le dimensionnement.

      https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
      (cherche "Resize the text area to given height and width in characters" dedans)

      Voilà un exemple qui fonctionne chez moi avec Putty, qui est un émulateur de terminal xterm (je n'ai pas d'installation avec X sous la main, mais cela devrait fonctionner avec tout émulateur xterm). Ce code redimensionne la fenêtre Windows dans laquelle s'exécute l'émulateur de terminal, en fonction des séquences d'échappement envoyées par le programme exécuté dans cet émulateur :

      #include <stdio.h>
      
      /*
       * Programme de test de séquences d'échappement xterm
       */
      
      int main(void)
      {
          printf("Pressez enter pour maximiser\n");
          getchar();
          printf("\e[9;1t");
      
          printf("Pressez enter pour restaurer la "
                  "taille avant maximisation\n");
          getchar();
          printf("\e[9;0t");
      
          printf("Pressez enter pour dimensionner "
                  "en 60 colonnes x 10 lignes\n");
          getchar();
          printf("\e[8;10;60t");
      
          return 0;
      }


      Dal
      1. Salut,

        Ce code ne redimensionne pas chez moi :/

        J'ai aussi essayé printf("\e[10;1t"); pour le mode plein écran, sans succès.

        Remarque, le plein écran me conviendrait aussi (ça enlèverait le problème de redimensionnement à chaque partie), s'il y a un moyen de faire ça simplement :)

        J'ai vu ça sur Internet : https://ohse.de/uwe/software/resize.c.html mais à la compilation, y a une fonction qu'il n'apprécie pas trop... tparam de mémoire
      2. Contributeur
        Ah, et si tu mets
        xterm*allowWindowOps: true
        dans
        ~/.Xdefaults
        ?

        (il se peut que tu doives sortir de ta session X et la réinitailiser, ou faire
        xrdb ~/.Xdefaults
        ).

        Sinon, je suis aussi tombé sur ce programme, qui permet de contrôler les fenêtres X pour des gestionnaires de fenêtres respectant la spécification EWMH (metacity pour Gnome et plein d'autres)

        http://tomas.styblo.name/wmctrl/

        Tu pourrais t'en servir pour identifier ta fenêtre et la redimensionner. Tu peux aussi télécharger ce programme et voir son code source, où on voit que la fonction window_move_resize utilise XResizeWindow (inclure
        X11/Xlib.h
        et linker avec
        -lX11
        ) pour redimensionner les fenêtres X (après avoir obtenu l'information sur les fenêtres existantes via
        XQueryTree
        , etc.).

        Mais vu que ta fenêtre est un terminal, envoyer des codes d'échappement est beaucoup plus simple.

        Dal
      3. Contributeur
        en voyant les options de ligne de commande de lxterminal, tu devrais aussi pouvoir faire :

        lxterminal --geometry=60x10 -e /chemin/vers/mon/programme
        pour fixer la taille au lancement

        Dal