Forum Programmation.c Appuie simultané de plusieurs touches

Posté par  .
Étiquettes : aucune
0
6
août
2009

Salut,



J'aimerais récupérer l'état de touches appuyées simultanément. J'arrive à récupérer la dernière touche appuyée sans attendre le retour chariot avec ce code :



struct termios tattr;
tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
tattr.c_cc[VMIN] = 0;
tattr.c_cc[VTIME] = 0;
tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);

while(1){
char c = 0;
if( read(0, &c, 1) != 0 )
printf("%c\n", c);
}

J'aimerais aussi récupérer l'état des touches Ctrl Alt et Shift. J'ai l'impression que je n'y arriverai pas avec ce code alors peut être faut-il jouer avec ioctl() mais j'ai du mal à trouver de la doc.


Si vous avez une solution ou des pistes, un grand merci.

  • # hmmm

    Posté par  . Évalué à 2.

    sans etre un as de la programmation

    il faut peut-etre lire un peu plus qu'un caractere,
    genre un MASK qui contiendrait les differentes touches
    ou qui indiquerait les touches meta enfoncées en plus de la lettre desirée
  • # Réponse

    Posté par  . Évalué à 3.

    Je suis désolé, j'ai été un peu prompt à poser ma question sur le forum, alors je vais tenter de me répondre moi même.

    J'ai eu une partie de ma réponse en allant chercher dans le code source de showkey (console-tools). Donc il faut bien désactivé les modes ICANON et ECHO de la console. Ensuite il faut placer le clavier en mode raw. C'est à dire que le clavier envoie un code pour la touche appuyé (toutes les touches, y compris Ctrl, Alt, CapsLock...) et un code pour la touche relâché. Ainsi, détecter l'appuie de plusieurs touches devient tout à fait possible.

    Le passage du clavier en mode raw se fait par la fonction ioctl(fd, KDSKBMODE, K_RAW) ou fd représente la console courante. Seul problème en mode graphique (émulation de console ex:konsole) X a déjà passé le clavier en raw puisqu'il capte les évenements du clavier (touches Windows,Ctrl et toutes les autres). D'ailleurs une autre méthode aurai été d'utilisé l'API du serveur graphique pour les événements.

    Donc le comportement est différent, si vous exécutez en console émulé (konsole) ou en console native. De plus pensez à bien réinitialisé le mode du clavier en fin de programme (lancer kbd_mode -a depuis une connexion ssh pour vous sauver)
    • [^] # Re: Réponse

      Posté par  . Évalué à 3.

      Si tu veux t'inspirer d'un autre outil, sous X, il y a xev.
    • [^] # Re: Réponse

      Posté par  . Évalué à 3.

      Accessoirement, si c'est pour faire de petits tests en local, tu peux utiliser stty pour modifier l'état de ton terminal depuis la ligne de commande.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.