Lecture du clavier : ioctl

Lecture du clavier : ioctl - C - Programmation

Marsh Posté le 08-03-2006 à 16:34:47    

Bonjour,
 
quand on utilise la fonction read avec le fd 0 (le clavier), la fonctio bufferise et bloque tant qu'on n'a pas appuye sur 'enter'.
en trippotant la line discipline, on peut dire a la fonction de renvoyer chaque touche du clavier (autant un caractere, qu'une touche special).

Code :
  1. ioctl(fd, TIOCGETA, &t);
  2.   t.c_lflag &= ~ICANON;                                                 
  3.   t.c_cc[VMIN] = 4;
  4.   t.c_cc[VTIME] = 1;
  5.   ioctl(fd, TIOCSETA, &t);


ca marche tres bien. j'arrive a recuperer toutes les touches.
seulement si je tape vite une serie de caractere, ou si je reste appuyer sur une touche (repetition). ca rammmeeeuhhhh :(
 
j'en conclu donc que ma methode est degueulasse et qu'il existe une methode plus propre et surtout plus performante.
 
 
mais je vois pas  :pt1cable:  
 
Help  :hello:

Reply

Marsh Posté le 08-03-2006 à 16:34:47   

Reply

Marsh Posté le 08-03-2006 à 16:47:52    

Tu peux peut-être essayer avec tcgetattr() / tcsetattr(), mais je suppose que ça fera la même chose...

Reply

Marsh Posté le 08-03-2006 à 17:41:32    

Reply

Marsh Posté le 09-03-2006 à 08:58:55    


tcsetattr ne marche pas du tout, ou il n'améliore pas ta solution ?

Reply

Marsh Posté le 10-03-2006 à 19:24:07    

Sous linux:
man 1 kbd_mode
...après faudrait voir le code de kbd_mode...
 
Sinon j ai ce morceau de code qui utilise termios:
 

Code :
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/ioctl.h>
  4. #include <termios.h>
  5. void init_keyboard()
  6. {
  7.   struct termios termios_p;
  8.   int fd=fileno(stdin);
  9.   tcgetattr(fd, &termios_p0);
  10.   tcgetattr(fd, &termios_p);
  11.   cfmakeraw(&termios_p);
  12.   cfsetispeed (&termios_p, 1);
  13.   tcsetattr (fd, TCSANOW, &termios_p);
  14.   term_attrs=fcntl(fd,F_GETFL);
  15.   fcntl(fd,F_SETFL,term_attrs|O_NONBLOCK);
  16. }
  17. void close_keyboard()
  18. {
  19.   int fd=fileno(stdin);
  20.   fcntl(fd,F_SETFL,term_attrs);
  21.   tcsetattr (fd, TCSANOW, &termios_p0);
  22. }


 

Reply

Marsh Posté le 10-03-2006 à 19:25:23    

ya ça aussi, à déclarer en global:
 

Code :
  1. struct termios termios_p0;
  2. int term_attrs;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed