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 NeoX . Évalué à 2.
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 elionne . Évalué à 3.
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 benoar . Évalué à 3.
[^] # Re: Réponse
Posté par Obsidian . Évalué à 3.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.