Detection clavier en C ANSI
Utilisateur anonyme
-
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
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
-
Il faut peut-être voir du côté de
man 3 termios
Allways close to Open Source...
Johan Daine -
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 -
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 -
essaye keypress()
il devrait de retourner 1 dés qu'une touche est dans le beffer du clavier
(tu le relis avec getch() )