{C Linux} lecture continue
juliendangers
Messages postés
246
Statut
Membre
-
juliendangers Messages postés 246 Statut Membre -
juliendangers Messages postés 246 Statut Membre -
Bonjour à tous,
Je fais appel à vos connaissances concernant la lecture continue sans validation comme le nécessite un scanf ou autre.
Je travail sous Ubuntu et mon but est de faire un menu déroulant en C.
Je dois pouvoir naviguer entre les différents items de ce menu à l'aide des flèches directionnelles (c'est là qu'est le problème), sans validation, de façon à ce qu'une pression sur la flèche du bas sélectionne l'item suivant!
Première solution envisagé, utilisé stty raw (et stty -echo pour ne pas avoir l'affichage du code de la touche) de façon à faire une lecture continue... Marche parfaitement si la navigation se fait à l'aide de simples caractères, mais oblige à la validation lors de l'appui sur une touche directionnelle, qui elle est sur plusieurs octets :s
J'ai vu l'alternative "getch" sous Windows, mais on m'impose de travailler sous Linux et je ne m'en plains pas^^ Existe t-il une fonction similaire sous Linux? Ou même tout autre solution =)
Je vous remercie
Je fais appel à vos connaissances concernant la lecture continue sans validation comme le nécessite un scanf ou autre.
Je travail sous Ubuntu et mon but est de faire un menu déroulant en C.
Je dois pouvoir naviguer entre les différents items de ce menu à l'aide des flèches directionnelles (c'est là qu'est le problème), sans validation, de façon à ce qu'une pression sur la flèche du bas sélectionne l'item suivant!
Première solution envisagé, utilisé stty raw (et stty -echo pour ne pas avoir l'affichage du code de la touche) de façon à faire une lecture continue... Marche parfaitement si la navigation se fait à l'aide de simples caractères, mais oblige à la validation lors de l'appui sur une touche directionnelle, qui elle est sur plusieurs octets :s
J'ai vu l'alternative "getch" sous Windows, mais on m'impose de travailler sous Linux et je ne m'en plains pas^^ Existe t-il une fonction similaire sous Linux? Ou même tout autre solution =)
Je vous remercie
A voir également:
- {C Linux} lecture continue
- Lecture epub sur pc - Guide
- Linux reader - Télécharger - Stockage
- Accusé de lecture gmail - Guide
- Confirmation de lecture whatsapp - Guide
- Lecture qr code pc - Guide
3 réponses
Bonjour,
Par défaut sur GNU/Linux, le terminal est en mode cooked. Il attend donc le retour chariot pour validation de la ligne. Pour ne pas avoir besoin de ce derner, vous allez devoir mettre le terminal en mode raw.
Il te faudra utiliser successivement les fonctions :
tcgetattr
cfmakeraw
tcsetattr
Je te renvoie aux man pour l'utilisation des fonctions. Néanmoins, je peux te donner un exemple si tu le souhaites.
Une fois que le terminal sera en mode raw, tu devras gérer les flèches qui sont des touches étendues, c'est-à-dire qu'elles se lisent sur deux caractères.
Il te faut donc détecter le premier caractère renvoyé (getchar() par exemple), regarder si c'est bien un code pour touches étendues et le cas échéant lire un deuxième caractère.
Je n'ai pas en mémoire la valeur des codes.
Mais tu peux te faire un programme qui teste ça facilement.
Du genre : while(getchar()!='\n'); en mode cooked (donc sans implémentation de la première fonction).
Et enfin, n'oublie pas de repasser ton terminal en mode cooked avant la fin de ton programme.
Si tu souhaites plus de détails, n'hésite pas.
Cordialement,
Par défaut sur GNU/Linux, le terminal est en mode cooked. Il attend donc le retour chariot pour validation de la ligne. Pour ne pas avoir besoin de ce derner, vous allez devoir mettre le terminal en mode raw.
Il te faudra utiliser successivement les fonctions :
tcgetattr
cfmakeraw
tcsetattr
Je te renvoie aux man pour l'utilisation des fonctions. Néanmoins, je peux te donner un exemple si tu le souhaites.
Une fois que le terminal sera en mode raw, tu devras gérer les flèches qui sont des touches étendues, c'est-à-dire qu'elles se lisent sur deux caractères.
Il te faut donc détecter le premier caractère renvoyé (getchar() par exemple), regarder si c'est bien un code pour touches étendues et le cas échéant lire un deuxième caractère.
Je n'ai pas en mémoire la valeur des codes.
Mais tu peux te faire un programme qui teste ça facilement.
Du genre : while(getchar()!='\n'); en mode cooked (donc sans implémentation de la première fonction).
Et enfin, n'oublie pas de repasser ton terminal en mode cooked avant la fin de ton programme.
Si tu souhaites plus de détails, n'hésite pas.
Cordialement,
je m'y attelle merci =)