Detection clavier en C ANSI

Utilisateur anonyme -  
 Utilisateur anonyme -
Salut les gars...
je recherche la fonction qui serait l'équivalent de "_kbhit" de la librairie conio.h
en effet, cette librairie n'existe pas sous linux.
mon but:
detecter qd l'utilisateur appuie sur une touche du clavier, pour sortir d'une boucle...
la fonction "getchar" ne convient pas car elle necessite l'appui sur "entree"...
je veux en gros lancer ma boucle, partir boire un cafe, et revenir un jour ou l'autre et arreter le prog en apuyant sur une touche...
mon pb est que toutes les fonctions d'I/O que g trouvées pour l'instant sont "bloquantes"
si kunkun a une piste, merci d'avance :)

.O
(_)__... Castor

4 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Il faut peut-être voir du côté de

    man 3 termios

    Allways close to Open Source...
    Johan Daine
    0
    1. Utilisateur anonyme
       
      il me semblait que termios se rapportat au communications vers des ports specifiques...
      mais je vais y jeter un coup d'oeil, merci jisisv
      .O
      (_)__... Castor
      0
  2. Utilisateur anonyme
     
    NOM
    termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain,
    tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed,
    cfsetispeed, cfsetospeed, tcgetpgrp, tcsetpgrp - Consulter
    ou indiquer les attributs de terminaux, le contrôle de
    ligne, la vitesse de transmission et le GID du processus
    en avant-plan sur un terminal.

    c bien ce que je pensais, c par rapport au terminal... mais bon je copntinue l'exploration qd mm ds ce man...

    .O
    (_)__... Castor
    0
    1. Utilisateur anonyme
       
      DESCRIPTION
      Les fonctions termios établissent une interface générale
      sous forme de terminal, permettant de contrôler les ports
      de communication asynchrone.

      c bien ca... juste les ports com.....
      mais ct une bonne idee, merci jisisv

      .O
      (_)__... Castor
      0
  3. jisisv Messages postés 3678 Statut Modérateur 936
     
    Voici un code extrait des sources du livre "Beginning Linux Programming" de Neil Matthews chez Wrox
    (voi le chargement sur http://www.wrox.com )
    #include <stdio.h>
    #include <termios.h>
    #include <term.h>
    #include <curses.h>
    #include <unistd.h>

    static struct termios initial_settings, new_settings;
    static int peek_character = -1;

    void init_keyboard();
    void close_keyboard();
    int kbhit();
    int readch();

    int main()
    {
    int ch = 0;

    init_keyboard();
    while(ch != 'q') {
    printf("looping\n");
    sleep(1);
    if(kbhit()) {
    ch = readch();
    printf("you hit %c\n",ch);
    }
    }
    close_keyboard();
    exit(0);
    }
    void init_keyboard()
    {
    tcgetattr(0,&initial_settings);
    new_settings = initial_settings;
    new_settings.c_lflag &= ~ICANON;
    new_settings.c_lflag &= ~ECHO;
    new_settings.c_lflag &= ~ISIG;
    new_settings.c_cc[VMIN] = 1;
    new_settings.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &new_settings);
    }

    void close_keyboard()
    {
    tcsetattr(0, TCSANOW, &initial_settings);
    }

    int kbhit()
    {
    char ch;
    int nread;

    if(peek_character != -1)
    return 1;
    new_settings.c_cc[VMIN]=0;
    tcsetattr(0, TCSANOW, &new_settings);
    nread = read(0,&ch,1);
    new_settings.c_cc[VMIN]=1;
    tcsetattr(0, TCSANOW, &new_settings);

    if(nread == 1) {
    peek_character = ch;
    return 1;
    }
    return 0;
    }

    int readch()
    {
    char ch;

    if(peek_character != -1) {
    ch = peek_character;
    peek_character = -1;
    return ch;
    }
    read(0,&ch,1);
    return ch;
    }

    Allways close to Open Source...
    Johan Daine
    0
    1. Utilisateur anonyme
       
      Je viens de voir que ma reponse n'est aps apparue dans le forum...
      je disais donc: "merci jisiv, ca marche nikel t le meileur" :-D

      .O
      (_)__... Castor
      0
  4. grosquik_ Messages postés 33 Statut Membre
     
    essaye keypress()
    il devrait de retourner 1 dés qu'une touche est dans le beffer du clavier
    (tu le relis avec getch() )
    0
    1. Utilisateur anonyme
       
      salut grosquik
      merci du tuyau, mais g pas trouve la lib qui contient "keypress", et un "man keypress" m'envoie balader ;)
      tu as la lib a inclure stp?

      .O
      (_)__... Castor
      0