Ce programme montre comment il est possible de récupérer des informations provenant de l'utilisateur lorsqu'il utilise un prompt sans bloquer l'exécution du programme.
Pour cela il utilise le système d'évènements de la librairie MLV :
À chaque fois qu'un utilisateur déplace la sourris, appuie sur les touches d'un clavier, ou entre du texte dans un prompt, un événèment est créé par la librairie MLV. Cet évènement est placé dans une file d'attente. Il est possible de récupérer toutes les informations concernant ces évènements en appelant la fonction MLV_get_event(). Cette fonction supprime le dernier évènement de la pile, l'analyse et renvoie, à l'aide de ses paramètres et de sa valeur de retour, toutes les informations le concernant.
#include <MLV/MLV_all.h> #include <stdlib.h> // // Fonction qui s'occupe de l'affichage de la démonstration. // void affichage( int width, int height, char* texte1, char* texte2 ){ // // Nettoie l'écran // MLV_draw_filled_rectangle( 0, 0, width, height, MLV_COLOR_BLACK ); // // Affichage de la consigne // MLV_draw_adapted_text_box( 10, 10, "Voici un programme qui permet de gérer deux zones de texte simultanément.\nPour quitter, il suffit d'écrire \"quit\" dans la zone de texte de droite.", 9, MLV_COLOR_BLACK, MLV_COLOR_GREEN, MLV_COLOR_BLACK, MLV_TEXT_CENTER ); // // Affichage du texte qui a été récupéré par le prompt 1 // MLV_draw_text( 10, 150, texte1, MLV_COLOR_GREEN ); // // Affichage du texte qui a été récupéré par le prompt 2 // MLV_draw_text( 220, 150, texte2, MLV_COLOR_GREEN ); // // Dessine tout les prompts // MLV_draw_all_prompt(); // // Met à jour l'affichage // MLV_actualise_window(); } // // Attention ! // Pour pouvoir compiler ce programme sous windows et sous macintosh, // il faut, pour la déclaration du main, respecter strictement la syntaxe // suivante : // int main(int argc, char *argv[]){ int width = 640, height = 460; char* texte, *texte1, *texte2; MLV_Prompt *prompt, *prompt1, *prompt2; MLV_Event event; // // Créé et affiche une fenêtre // MLV_create_window( "medium - 3 - prompt events", "prompt events", width, height ); // // Créé le premier prompt // prompt1 = MLV_create_prompt( 10, 100, 200, 30, MLV_COLOR_GREEN, MLV_COLOR_GREEN, MLV_COLOR_BLACK, "Prompt 1 : " ); texte1 = (char*) malloc( 1*sizeof(char) ); *texte1 = '\0'; // // Créé le second prompt // prompt2 = MLV_create_prompt( 220, 100, 200, 30, MLV_COLOR_GREEN, MLV_COLOR_GREEN, MLV_COLOR_BLACK, "Prompt 2 : " ); texte2 = (char*) malloc( 1*sizeof(char) ); *texte2 = '\0'; // // Met à jour l'affichage // affichage( width, height, texte1, texte2 ); // // Tant que le texte récupéré par le second prompt est différent de // la chaîne de charactères "quit" on demande à l'utilisateur d'entrer // du texte dans un des deux prompts et on affiche le texte ainsi // rentré. // do { // // Récupère un évènement // event = MLV_get_event( NULL, NULL, NULL, &texte, &prompt, NULL, NULL, NULL, NULL ); // // On traite l'évènement si il s'agit d'un prompt // if( event == MLV_PROMPT ){ // // On met à jour le texte associé au prompt 1 si c'est // le prompt 1 qui a récupéré le texte // if( prompt == prompt1 ){ // // on libère la mémoire pointée par texte1 avant // de remplacer texte1 par le pointeur de texte2 // free( texte1 ); texte1 = texte; } // // On met à jour le texte associé au prompt 2 si c'est // le prompt 2 qui a récupéré le texte // if( prompt == prompt2 ){ // // on libère la mémoire pointée par texte1 avant // de remplacer texte1 par le pointeur de texte2 // free( texte2 ); texte2 = texte; } } // // Met à jour l'affichage // affichage( width, height, texte1, texte2 ); } while( strcmp( texte2, "quit" ) ); // // Libère la mémoire utilisée par texte 1 et text 2 // free( texte1 ); free( texte2 ); // // Ferme tous les prompts // MLV_free_prompt( prompt1 ); MLV_free_prompt( prompt2 ); // // Ferme la fenêtre // MLV_free_window(); return 0; }