{C Linux} lecture continue

Fermé
juliendangers Messages postés 226 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 28 octobre 2011 - 31 mars 2010 à 19:00
juliendangers Messages postés 226 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 28 octobre 2011 - 1 avril 2010 à 09:52
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



A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 avril 2010 à 07:52
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,
3
juliendangers Messages postés 226 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 28 octobre 2011 43
1 avril 2010 à 09:52
merci beaucoup! les codes des touches je les ai pas de soucis pour ca ;)
je m'y attelle merci =)
0
Bonjour,

Est-ce que tu as le droit d'utiliser des bibliothèques externes dans ton projet ?
0
juliendangers Messages postés 226 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 28 octobre 2011 43
31 mars 2010 à 21:16
normalement non, seulement les bibliothèques standards normalement plus celle du prof...
mais bon je suis preneur de toute solution, premièrement pour ma culture, et deuxièmement car je ne suis pas sur :D
0