Depuis la sortie de ndless 3 (merci à vous


Pour l'instant, j'ai commencé à coder de quoi gérer une boîte de texte dans laquelle on peut taper du texte, se déplacer et supprimer des caractères. En gros, il y a une structure chargée de stocker les données liées à la boîte, une fonction input_draw pour afficher la boîte et une fonction input_callback que l'on devait appeler chaque fois qu'il se passait quelque chose (en général, après un wait_key_pressed()) et qui regardait un peu toutes les touches pour voir ce qui s'était passé. Ça marchait, mais il fallait faire bien attention à ne pas appuyer sur plusieurs touches en même temps lors de la saisie.
J'ai donc voulu coder un système de gestion des événements un peu comme le fait SDL (et sans doutes comme sur Ti-89 si mes souvenirs sont exacts) : à chaque début de boucle (dans le cas d'un jeu) ou à chaque appui de touche (dans le cas d'un programme plus passif), on appelle une fonction event_poll(Event *ev) qui se charge de placer un événement dans le pointeur ev et de renvoyer 1 tant qu'il y a encore des événements à traiter. Pour information, la structure Event se compose de :
1. type : enum {KEYDOWN, KEYUP}
2. key : enum {toutes les touches définies dans common.h avec le préfixe EVKEY_}
Le gros problème est la récupération de ces événements... Deux méthodes :
1. La fonction poll_event est appelée après un wait_key_pressed() et se charge de remplir la pile des événements avec ce qui a bougé depuis la dernière fois. Malheureusement, vu qu'on ne réagit qu'après un appui de touche et pas après la fin d'un appui de touche (ce qui est pourtant très important dès qu'on veut faire des choses un peu subtiles), il est impossible de détecter immédiatement les relâchements.
2. On boucle sur poll_event() quand on a un programme passif, et on boucle sur poll_event() jusqu'à devoir afficher l'image suivante quand on a un jeu. Ça marche très bien ! Je suis certain que les fabricants de piles et de batteries du monde entier se porteraient bien mieux si tout le monde faisait comme ça

J'imagine que la Ti N-Spire doit consommer beaucoup moins d'énergie lorsqu'on fait une attente passive, d'où, finalement, ma question : y a t'il un moyen d'appeler automatiquement une certaine fonction lors de l'appui sur une touche ou au moins d'endormir le programme jusqu'au moindre petit événement (que ce soit un appui ou un relâchement) ? Si je me souviens bien de mon cours d'architecture, lors de l'appui une interruption doit être produite et une fonction de l'OS est appelée pour traiter cet événement. Peut-être pourrait-on demander à la machine ou à l'OS d'appeler une fonction donnée lors de la réception de l'interruption ? Je n'ai jamais touché à quoi que ce soit de plus bas niveau que du C avec SDL, donc je dis sans doutes n'importe quoi...
Merci et bonne soirée !