From fa71dea18dd7ab7f80e1a326171783551932de53 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 26 Mar 2009 19:41:33 +0000 Subject: [PATCH] Code cleanup: Removed the code related to Save/Load window from buttons.c, transferred it to files.c. Files.h now only exposes this window's function. Some code related to this window is still in loadsave.c (stuff for preview) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@695 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 911 --------------------------------------------------- files.c | 937 +++++++++++++++++++++++++++++++++++++++++++++++++++-- files.h | 35 +- graph.h | 5 - init.c | 11 +- io.c | 42 +++ io.h | 9 + loadsave.c | 97 ++---- main.c | 3 +- setup.c | 1 - texte.c | 1 - windows.h | 7 + 12 files changed, 1001 insertions(+), 1058 deletions(-) diff --git a/boutons.c b/boutons.c index 151dd191..02f97fe6 100644 --- a/boutons.c +++ b/boutons.c @@ -54,8 +54,6 @@ #define FILENAMESPACE 13 -#define Display_Window(x,y) UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,(x)*Menu_Facteur_X,(y)*Menu_Facteur_Y); - extern short Old_MX; extern short Old_MY; @@ -2231,915 +2229,6 @@ void Bouton_Brosse_monochrome(void) Afficher_curseur(); } -//------------------------ Chargements et sauvegardes ------------------------ - -void Print_repertoire_courant(void) -// -// Affiche Principal_Repertoire_courant sur 37 caractères -// -{ - char Nom_temporaire[TAILLE_MAXI_PATH+1]; // Nom tronqué - int length; // length du répertoire courant - int Indice; // Indice de parcours de la chaine complète - - Block(Fenetre_Pos_X+(Menu_Facteur_X*7),Fenetre_Pos_Y+(Menu_Facteur_Y*43),Menu_Facteur_X*37*8,Menu_Facteur_Y<<3,CM_Clair); - - length=strlen(Principal_Repertoire_courant); - if (length>TAILLE_MAXI_PATH) - { // Doh! il va falloir tronquer le répertoire (bouh !) - - // On commence par copier bêtement les 3 premiers caractères (e.g. "C:\") - for (Indice=0;Indice<3;Indice++) - Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice]; - - // On y rajoute 3 petits points: - strcpy(Nom_temporaire+3,"..."); - - // Ensuite, on cherche un endroit à partir duquel on pourrait loger tout - // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!) - for (Indice++;IndiceNb_elements=Liste_Nb_elements; - button->Position=Position; - Calculer_hauteur_curseur_jauge(button); - Fenetre_Dessiner_jauge(button); - // On efface les anciens noms de fichier: - Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); - // On affiche les nouveaux: - Afficher_la_liste_des_fichiers(Position,offset); - - UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82); - - // On récupère le nom du schmilblick à "accéder" - Determiner_element_de_la_liste(Position,offset,Principal_Nom_fichier,&Type_selectionne); - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - // On affiche le nom du répertoire courant - Print_repertoire_courant(); -} - - -void Relire_liste_fichiers(byte Filtre, short Position, short offset, - T_Bouton_scroller * button) -{ - Lire_liste_des_fichiers(Filtre); - Trier_la_liste_des_fichiers(); - Preparer_et_afficher_liste_fichiers(Position,offset,button); -} - -void On_vient_de_scroller_dans_le_fileselect(T_Bouton_scroller * Scroller_de_fichiers) -{ - char Ancien_nom_de_fichier[TAILLE_CHEMIN_FICHIER]; - - strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier); - - // On regarde si la liste a bougé - if (Scroller_de_fichiers->Position!=Principal_File_list_Position) - { - // Si c'est le cas, il faut mettre à jour la jauge - Scroller_de_fichiers->Position=Principal_File_list_Position; - Fenetre_Dessiner_jauge(Scroller_de_fichiers); - } - // On récupére le nom du schmilblick à "accéder" - Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne); - if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier)) - Nouvelle_preview=1; - - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - Afficher_curseur(); -} - - -short Position_fichier_dans_liste(char * fname) -{ - Element_de_liste_de_fileselect * Element_courant; - short Indice; - - for (Indice=0, Element_courant=Liste_du_fileselect; - ((Element_courant!=NULL) && (strcmp(Element_courant->NomComplet,fname))); - Indice++,Element_courant=Element_courant->Suivant); - - return (Element_courant!=NULL)?Indice:0; -} - - -void Placer_barre_de_selection_sur(char * fname) -{ - short Indice; - - Indice=Position_fichier_dans_liste(fname); - - if ((Liste_Nb_elements<=10) || (Indice<5)) - { - Principal_File_list_Position=0; - Principal_File_list_Decalage=Indice; - } - else - { - if (Indice>=Liste_Nb_elements-5) - { - Principal_File_list_Position=Liste_Nb_elements-10; - Principal_File_list_Decalage=Indice-Principal_File_list_Position; - } - else - { - Principal_File_list_Position=Indice-4; - Principal_File_list_Decalage=4; - } - } -} - - -char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER]; -char * Nom_correspondant_le_mieux_a(char * fname) -{ - char * Pointeur_Meilleur_nom; - Element_de_liste_de_fileselect * Element_courant; - byte Lettres_identiques=0; - byte counter; - - strcpy(FFF_Meilleur_nom,Principal_Nom_fichier); - Pointeur_Meilleur_nom=NULL; - - for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant) - { - if ( (!Config.Find_file_fast) - || (Config.Find_file_fast==(Element_courant->Type+1)) ) - { - // On compare et si c'est mieux, on stocke dans Meilleur_nom - for (counter=0; fname[counter]!='\0' && tolower(Element_courant->NomComplet[counter])==tolower(fname[counter]); counter++); - if (counter>Lettres_identiques) - { - Lettres_identiques=counter; - strcpy(FFF_Meilleur_nom,Element_courant->NomComplet); - Pointeur_Meilleur_nom=Element_courant->NomComplet; - } - } - } - - return Pointeur_Meilleur_nom; -} - -byte Bouton_Load_ou_Save(byte load, byte image) - // load=1 => On affiche le menu du bouton LOAD - // load=0 => On affiche le menu du bouton SAVE -{ - short Bouton_clicke; - T_Bouton_scroller * Scroller_de_fichiers; - T_Bouton_dropdown * Dropdown_des_formats; - T_Bouton_dropdown * Dropdown_bookmark[4]; - short Temp; - int Bidon=0; // Sert à appeler SDL_GetKeyState - byte Charger_ou_sauver_l_image=0; - byte On_a_clicke_sur_OK=0;// Indique si on a clické sur Load ou Save ou sur - //un bouton enclenchant Load ou Save juste après. - Composantes * Palette_initiale; // | Données concernant l'image qui - byte Image_modifiee_initiale; // | sont mémorisées pour pouvoir - short Largeur_image_initiale; // |- être restaurées en sortant, - short Hauteur_image_initiale; // | parce que la preview elle les - byte Back_color_initiale; // | fout en l'air (c'te conne). - char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; // Sert à laisser le nom courant du fichier en cas de sauvegarde - char Repertoire_precedent[TAILLE_CHEMIN_FICHIER]; // Répertoire d'où l'on vient après un CHDIR - char Commentaire_initial[TAILLE_COMMENTAIRE+1]; - char Fichier_recherche[TAILLE_CHEMIN_FICHIER]=""; - char Nom_fichier_Save[TAILLE_CHEMIN_FICHIER]; - char * Fichier_le_plus_ressemblant; - - Palette_initiale=(Composantes *)malloc(sizeof(T_Palette)); - memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); - - Back_color_initiale=Back_color; - Image_modifiee_initiale=Principal_Image_modifiee; - Largeur_image_initiale=Principal_Largeur_image; - Hauteur_image_initiale=Principal_Hauteur_image; - strcpy(Nom_fichier_initial,Principal_Nom_fichier); - strcpy(Commentaire_initial,Principal_Commentaire); - if (load) - { - if (image) - Ouvrir_fenetre(310,187+FILENAMESPACE,"Load picture"); - else - Ouvrir_fenetre(310,187+FILENAMESPACE,"Load brush"); - Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Load",0,1,SDLK_RETURN); // 1 - } - else - { - if (image) - Ouvrir_fenetre(310,187+FILENAMESPACE,"Save picture"); - else - Ouvrir_fenetre(310,187+FILENAMESPACE,"Save brush"); - Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Save",0,1,SDLK_RETURN); // 1 - if (Principal_Format==0) // Correction du *.* - { - Principal_Format=Principal_Format_fichier; - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - } - - if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable - { - Principal_Format=FORMAT_PAR_DEFAUT; - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - } - // Affichage du commentaire - if (FormatFichier[Principal_Format-1].Commentaire) - Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); - } - - Fenetre_Definir_bouton_normal(125,139+FILENAMESPACE,51,14,"Cancel",0,1,TOUCHE_ESC); // 2 - Fenetre_Definir_bouton_normal(125, 89+FILENAMESPACE,51,14,"Delete",0,1,SDLK_DELETE); // 3 - - // Cadre autour des formats - Fenetre_Afficher_cadre( 7, 51,104, 35); - // Cadre autour des infos sur le fichier de dessin - Fenetre_Afficher_cadre(116, 51,187, 35); - // Cadre autour de la preview - Fenetre_Afficher_cadre_creux(179,88+FILENAMESPACE,124,84); - // Cadre autour du fileselector - Fenetre_Afficher_cadre_creux( 7,88+FILENAMESPACE,100,84); - - Fenetre_Definir_bouton_special(9,90+FILENAMESPACE,96,80); // 4 - - // Scroller du fileselector - Scroller_de_fichiers = Fenetre_Definir_bouton_scroller(110,89+FILENAMESPACE,82,1,10,0); // 5 - - // Dropdown pour les formats de fichier - Dropdown_des_formats= - Fenetre_Definir_bouton_dropdown(70,56,36,16,0, - (Principal_Format==0)?"*.*":FormatFichier[Principal_Format-1].Extension, - 1,0,1,A_DROITE|A_GAUCHE); // 6 - if (load) - Fenetre_Dropdown_choix(Dropdown_des_formats,0,"*.*"); - for (Temp=0;TempPos_X+3,Dropdown_bookmark[Temp]->Pos_Y+2,5); - Afficher_bookmark(Dropdown_bookmark[Temp],Temp); - } - // On prend bien soin de passer dans le répertoire courant (le bon qui faut! Oui madame!) - if (load) - { - chdir(Principal_Repertoire_courant); - Determiner_repertoire_courant(); - } - else - { - chdir(Principal_Repertoire_fichier); - Determiner_repertoire_courant(); - } - - // Affichage des premiers fichiers visibles: - Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - - if (!load) - { - // On initialise le nom de fichier à celui en cours et non pas celui sous - // la barre de sélection - strcpy(Principal_Nom_fichier,Nom_fichier_initial); - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - } - - Pixel_de_chargement=Pixel_Chargement_dans_preview; - Nouvelle_preview=1; - Display_Window(310,(187+FILENAMESPACE)); - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case -1 : - case 0 : - break; - - case 1 : // Load ou Save - if(load) - { - // Determine the type - if(Fichier_existe(Principal_Nom_fichier)) - { - Type_selectionne = 0; - if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1; - } - else - { - Type_selectionne = 1; - } - } - else - { - if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1; - else Type_selectionne = 0; - } - On_a_clicke_sur_OK=1; - break; - - case 2 : // Cancel - break; - - case 3 : // Delete - if (Liste_Nb_elements && (*Principal_Nom_fichier!='.') && Type_selectionne!=2) - { - char * Message; - Effacer_curseur(); - // On affiche une demande de confirmation - if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) - { - Message="Delete file ?"; - } - else - { - Message="Remove directory ?"; - } - if (Demande_de_confirmation(Message)) - { - // Si c'est un fichier - if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) - // On efface le fichier (si on peut) - Temp=(!remove(Principal_Nom_fichier)); - else // Si c'est un repertoire - // On efface le repertoire (si on peut) - Temp=(!rmdir(Principal_Nom_fichier)); - - if (Temp) // Temp indique si l'effacement s'est bien passé - { - // On remonte si c'était le dernier élément de la liste - if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1) - { - if (Principal_File_list_Position) - Principal_File_list_Position--; - else - if (Principal_File_list_Decalage) - Principal_File_list_Decalage--; - } - else // Si ce n'était pas le dernier, il faut faire gaffe à ce - { // que ses copains d'en dessous ne remontent pas trop. - if ( (Principal_File_list_Position) - && (Principal_File_list_Position+10==Liste_Nb_elements) ) - { - Principal_File_list_Position--; - Principal_File_list_Decalage++; - } - } - // On relit les informations - Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - // On demande la preview du nouveau fichier sur lequel on se trouve - Nouvelle_preview=1; - } - else - Erreur(0); - - // On place la barre de sélection du brouillon au début s'il a le - // même répertoire que l'image principale. - if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant)) - { - Brouillon_File_list_Position=0; - Brouillon_File_list_Decalage=0; - } - } - } - break; - - case 4 : // Zone d'affichage de la liste de fichiers - Effacer_curseur(); - - Temp=Calculer_decalage_click_dans_fileselector(); - if (Temp>=0) - { - if (Temp!=Principal_File_list_Decalage) - { - // On met à jour le décalage - Principal_File_list_Decalage=Temp; - - // On récupére le nom du schmilblick à "accéder" - Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne); - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - // On affiche à nouveau la liste - Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage); - - // On vient de changer de nom de fichier, donc on doit s'appreter - // a rafficher une preview - Nouvelle_preview=1; - *Fichier_recherche=0; - } - else - { - // En sauvegarde, si on a double-clické sur un répertoire, il - // faut mettre le nom de fichier au nom du répertoire. Sinon, dans - // certains cas, on risque de sauvegarder avec le nom du fichier - // actuel au lieu de changer de répertoire. - if (Principal_File_list_Position+Principal_File_list_Decalage=10 && Bouton_clicke<10+NB_BOOKMARKS) - { - // Bookmark - char * Nom_repertoire; - - switch(Fenetre_Attribut2) - { - case -1: // bouton lui-même: aller au répertoire mémorisé - if (Config.Bookmark_directory[Bouton_clicke-10]) - { - *Fichier_recherche=0; - strcpy(Principal_Nom_fichier,Config.Bookmark_directory[Bouton_clicke-10]); - Type_selectionne=1; - On_a_clicke_sur_OK=1; - *Fichier_recherche=0; - } - break; - - case 0: // Set - if (Config.Bookmark_directory[Bouton_clicke-10]) - free(Config.Bookmark_directory[Bouton_clicke-10]); - Config.Bookmark_label[Bouton_clicke-10][0]='\0'; - Temp=strlen(Principal_Repertoire_courant); - Config.Bookmark_directory[Bouton_clicke-10]=malloc(Temp+1); - strcpy(Config.Bookmark_directory[Bouton_clicke-10],Principal_Repertoire_courant); - - Nom_repertoire=Position_dernier_slash(Principal_Repertoire_courant); - if (Nom_repertoire && Nom_repertoire[1]!='\0') - Nom_repertoire++; - else - Nom_repertoire=Principal_Repertoire_courant; - Temp=strlen(Nom_repertoire); - strncpy(Config.Bookmark_label[Bouton_clicke-10],Nom_repertoire,8); - if (Temp>8) - { - Config.Bookmark_label[Bouton_clicke-10][7]=CARACTERE_SUSPENSION; - Config.Bookmark_label[Bouton_clicke-10][8]='\0'; - } - Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); - break; - - case 1: // Rename - if (Config.Bookmark_directory[Bouton_clicke-10]) - { - // On enlève les "..." avant l'édition - char bookmark_label[8+1]; - strcpy(bookmark_label, Config.Bookmark_label[Bouton_clicke-10]); - if (bookmark_label[7]==CARACTERE_SUSPENSION) - bookmark_label[7]='\0'; - if (Readline_ex(Dropdown_bookmark[Bouton_clicke-10]->Pos_X+3+10,Dropdown_bookmark[Bouton_clicke-10]->Pos_Y+2,bookmark_label,8,8,0)) - strcpy(Config.Bookmark_label[Bouton_clicke-10],bookmark_label); - Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); - Afficher_curseur(); - } - break; - - case 2: // Clear - if (Config.Bookmark_directory[Bouton_clicke-10] && Demande_de_confirmation("Erase bookmark ?")) - { - free(Config.Bookmark_directory[Bouton_clicke-10]); - Config.Bookmark_directory[Bouton_clicke-10]=NULL; - Config.Bookmark_label[Bouton_clicke-10][0]='\0'; - Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); - } - break; - } - } - break; - } - - switch (Touche) - { - case SDLK_UNKNOWN : break; - case SDLK_DOWN : // Bas - *Fichier_recherche=0; - Effacer_curseur(); - Select_Scroll_Down(&Principal_File_list_Position,&Principal_File_list_Decalage); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_UP : // Haut - *Fichier_recherche=0; - Effacer_curseur(); - Select_Scroll_Up(&Principal_File_list_Position,&Principal_File_list_Decalage); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_PAGEDOWN : // PageDown - *Fichier_recherche=0; - Effacer_curseur(); - Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,9); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_PAGEUP : // PageUp - *Fichier_recherche=0; - Effacer_curseur(); - Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,9); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_END : // End - *Fichier_recherche=0; - Effacer_curseur(); - Select_End(&Principal_File_list_Position,&Principal_File_list_Decalage); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_HOME : // Home - *Fichier_recherche=0; - Effacer_curseur(); - Select_Home(&Principal_File_list_Position,&Principal_File_list_Decalage); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case TOUCHE_MOUSEWHEELDOWN : - *Fichier_recherche=0; - Effacer_curseur(); - Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,3); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case TOUCHE_MOUSEWHEELUP : - *Fichier_recherche=0; - Effacer_curseur(); - Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,3); - On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); - Touche=0; - break; - case SDLK_BACKSPACE : // Backspace - *Fichier_recherche=0; - // Si le choix ".." est bien en tête des propositions... - if (!strcmp(Liste_du_fileselect->NomComplet,PARENT_DIR)) - { - // On va dans le répertoire parent. - strcpy(Principal_Nom_fichier,PARENT_DIR); - Type_selectionne=1; - On_a_clicke_sur_OK=1; - } - Touche=0; - break; - default: // Autre => On se place sur le nom de fichier qui correspond - if (Bouton_clicke<=0) - { - if (Est_Raccourci(Touche,0x100+BOUTON_AIDE)) - { - Fenetre_aide(load?BOUTON_CHARGER:BOUTON_SAUVER, NULL); - break; - } - Temp=strlen(Fichier_recherche); - if (Touche_ANSI>= ' ' && Touche_ANSI < 255 && Temp<50) - { - Fichier_recherche[Temp]=Touche_ANSI; - Fichier_recherche[Temp+1]='\0'; - Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche); - if ( (Fichier_le_plus_ressemblant) ) - { - Temp=Principal_File_list_Position+Principal_File_list_Decalage; - Effacer_curseur(); - Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant); - Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - Afficher_curseur(); - if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage) - Nouvelle_preview=1; - } - else - *Fichier_recherche=0; - Touche=0; - } - } - else - *Fichier_recherche=0; - } - - if (On_a_clicke_sur_OK) - { - // Si c'est un répertoire, on annule "On_a_clicke_sur_OK" et on passe - // dedans. - if (Type_selectionne!=0) - { - Effacer_curseur(); - On_a_clicke_sur_OK=0; - - // On mémorise le répertoire dans lequel on était - if (strcmp(Principal_Nom_fichier,PARENT_DIR)) - strcpy(Repertoire_precedent,Nom_formate(PARENT_DIR, 1)); - else - { - strcpy(Repertoire_precedent, - Nom_formate(Position_dernier_slash(Principal_Repertoire_courant), 1) - ); - } - - // On doit rentrer dans le répertoire: - if (!chdir(Principal_Nom_fichier)) - { - Determiner_repertoire_courant(); - - // On lit le nouveau répertoire - Lire_liste_des_fichiers(Principal_Format); - Trier_la_liste_des_fichiers(); - // On place la barre de sélection sur le répertoire d'où l'on vient - Placer_barre_de_selection_sur(Repertoire_precedent); - } - else - Erreur(0); - // Affichage des premiers fichiers visibles: - Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - Afficher_curseur(); - Nouvelle_preview=1; - } - else // Sinon on essaye de charger ou sauver le fichier - { - strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); - if (!load) - Principal_Format_fichier=Principal_Format; - Charger_ou_sauver_l_image=1; - } - } - - // Gestion du chrono et des previews - if (Nouvelle_preview) - { - // On efface les infos de la preview précédente s'il y en a une - // d'affichée - if (Etat_chrono==2) - { - Effacer_curseur(); - // On efface le commentaire précédent - Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y, - Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); - // On nettoie la zone où va s'afficher la preview: - Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y, - Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair); - // On efface les dimensions de l'image - Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y, - Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); - // On efface la taille du fichier - Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y, - Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); - // On efface le format du fichier - Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 72*Menu_Facteur_Y, - Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); - // Affichage du commentaire - if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) ) - { - Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); - } - Afficher_curseur(); - // Un update pour couvrir les 4 zones: 3 libellés plus la zone de preview - UpdateRect(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+55*Menu_Facteur_Y,Menu_Facteur_X*122,Menu_Facteur_Y*(116+FILENAMESPACE)); - // Zone de commentaire - UpdateRect(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,Menu_Facteur_X*32*8,Menu_Facteur_Y*8); - } - - Nouvelle_preview=0; - Etat_chrono=0; // Etat du chrono = Attente d'un Xème de seconde - // On lit le temps de départ du chrono - Initialiser_chrono(Config.Chrono_delay); - } - - if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder - Tester_chrono(); // s'il ne faut pas afficher la preview - - if (Etat_chrono==1) // Il faut afficher la preview - { - if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) ) - { - strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); - - Effacer_curseur(); - Charger_image(image); - UpdateRect(ToWinX(179),ToWinY(88+FILENAMESPACE),ToWinL(124),ToWinH(84)); - Afficher_curseur(); - - // Après le chargement de la preview, on restaure tout ce qui aurait - // pu être modifié par le chargement de l'image: - memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); - Principal_Image_modifiee=Image_modifiee_initiale; - Principal_Largeur_image=Largeur_image_initiale; - Principal_Hauteur_image=Hauteur_image_initiale; - } - - Etat_chrono=2; // On arrête le chrono - } - } - while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) ); - - // Si on annule, on restaure l'ancien commentaire - if (Bouton_clicke==2) - strcpy(Principal_Commentaire,Commentaire_initial); - - // On restaure les données de l'image qui ont certainement été modifiées - // par la preview. - memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); - Set_palette(Principal_Palette); - Back_color=Back_color_initiale; - Principal_Image_modifiee=Image_modifiee_initiale; - Principal_Largeur_image=Largeur_image_initiale; - Principal_Hauteur_image=Hauteur_image_initiale; - Set_palette(Principal_Palette); - - Calculer_couleurs_menu_optimales(Principal_Palette); - Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)TAILLE_MAXI_PATH) + { // Doh! il va falloir tronquer le répertoire (bouh !) + + // On commence par copier bêtement les 3 premiers caractères (e.g. "C:\") + for (Indice=0;Indice<3;Indice++) + Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice]; + + // On y rajoute 3 petits points: + strcpy(Nom_temporaire+3,"..."); + + // Ensuite, on cherche un endroit à partir duquel on pourrait loger tout + // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!) + for (Indice++;IndiceNb_elements=Liste_Nb_elements; + button->Position=Position; + Calculer_hauteur_curseur_jauge(button); + Fenetre_Dessiner_jauge(button); + // On efface les anciens noms de fichier: + Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); + // On affiche les nouveaux: + Afficher_la_liste_des_fichiers(Position,offset); + + UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82); + + // On récupère le nom du schmilblick à "accéder" + Determiner_element_de_la_liste(Position,offset,Principal_Nom_fichier,&Type_selectionne); + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + // On affiche le nom du répertoire courant + Print_repertoire_courant(); +} + + +void Relire_liste_fichiers(byte Filtre, short Position, short offset, + T_Bouton_scroller * button) +{ + Lire_liste_des_fichiers(Filtre); + Trier_la_liste_des_fichiers(); + Preparer_et_afficher_liste_fichiers(Position,offset,button); +} + +void On_vient_de_scroller_dans_le_fileselect(T_Bouton_scroller * Scroller_de_fichiers) +{ + char Ancien_nom_de_fichier[TAILLE_CHEMIN_FICHIER]; + + strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier); + + // On regarde si la liste a bougé + if (Scroller_de_fichiers->Position!=Principal_File_list_Position) { - struct stat Infos_enreg; - strcpy(&Nom_fichier_complet[Position_nom_fichier], entry->d_name); - stat(Nom_fichier_complet,&Infos_enreg); - if (S_ISREG(Infos_enreg.st_mode)) + // Si c'est le cas, il faut mettre à jour la jauge + Scroller_de_fichiers->Position=Principal_File_list_Position; + Fenetre_Dessiner_jauge(Scroller_de_fichiers); + } + // On récupére le nom du schmilblick à "accéder" + Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne); + if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier)) + Nouvelle_preview=1; + + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + Afficher_curseur(); +} + + +short Position_fichier_dans_liste(char * fname) +{ + Element_de_liste_de_fileselect * Element_courant; + short Indice; + + for (Indice=0, Element_courant=Liste_du_fileselect; + ((Element_courant!=NULL) && (strcmp(Element_courant->NomComplet,fname))); + Indice++,Element_courant=Element_courant->Suivant); + + return (Element_courant!=NULL)?Indice:0; +} + + +void Placer_barre_de_selection_sur(char * fname) +{ + short Indice; + + Indice=Position_fichier_dans_liste(fname); + + if ((Liste_Nb_elements<=10) || (Indice<5)) + { + Principal_File_list_Position=0; + Principal_File_list_Decalage=Indice; + } + else + { + if (Indice>=Liste_Nb_elements-5) { - Callback(Nom_fichier_complet); + Principal_File_list_Position=Liste_Nb_elements-10; + Principal_File_list_Decalage=Indice-Principal_File_list_Position; + } + else + { + Principal_File_list_Position=Indice-4; + Principal_File_list_Decalage=4; } } - closedir(Repertoire_Courant); +} + + +char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER]; +char * Nom_correspondant_le_mieux_a(char * fname) +{ + char * Pointeur_Meilleur_nom; + Element_de_liste_de_fileselect * Element_courant; + byte Lettres_identiques=0; + byte counter; + + strcpy(FFF_Meilleur_nom,Principal_Nom_fichier); + Pointeur_Meilleur_nom=NULL; + + for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant) + { + if ( (!Config.Find_file_fast) + || (Config.Find_file_fast==(Element_courant->Type+1)) ) + { + // On compare et si c'est mieux, on stocke dans Meilleur_nom + for (counter=0; fname[counter]!='\0' && tolower(Element_courant->NomComplet[counter])==tolower(fname[counter]); counter++); + if (counter>Lettres_identiques) + { + Lettres_identiques=counter; + strcpy(FFF_Meilleur_nom,Element_courant->NomComplet); + Pointeur_Meilleur_nom=Element_courant->NomComplet; + } + } + } + + return Pointeur_Meilleur_nom; +} + +byte Bouton_Load_ou_Save(byte load, byte image) + // load=1 => On affiche le menu du bouton LOAD + // load=0 => On affiche le menu du bouton SAVE +{ + short Bouton_clicke; + T_Bouton_scroller * Scroller_de_fichiers; + T_Bouton_dropdown * Dropdown_des_formats; + T_Bouton_dropdown * Dropdown_bookmark[4]; + short Temp; + int Bidon=0; // Sert à appeler SDL_GetKeyState + byte Charger_ou_sauver_l_image=0; + byte On_a_clicke_sur_OK=0;// Indique si on a clické sur Load ou Save ou sur + //un bouton enclenchant Load ou Save juste après. + Composantes * Palette_initiale; // | Données concernant l'image qui + byte Image_modifiee_initiale; // | sont mémorisées pour pouvoir + short Largeur_image_initiale; // |- être restaurées en sortant, + short Hauteur_image_initiale; // | parce que la preview elle les + byte Back_color_initiale; // | fout en l'air (c'te conne). + char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; // Sert à laisser le nom courant du fichier en cas de sauvegarde + char Repertoire_precedent[TAILLE_CHEMIN_FICHIER]; // Répertoire d'où l'on vient après un CHDIR + char Commentaire_initial[TAILLE_COMMENTAIRE+1]; + char Fichier_recherche[TAILLE_CHEMIN_FICHIER]=""; + char Nom_fichier_Save[TAILLE_CHEMIN_FICHIER]; + char * Fichier_le_plus_ressemblant; + + Palette_initiale=(Composantes *)malloc(sizeof(T_Palette)); + memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); + + Back_color_initiale=Back_color; + Image_modifiee_initiale=Principal_Image_modifiee; + Largeur_image_initiale=Principal_Largeur_image; + Hauteur_image_initiale=Principal_Hauteur_image; + strcpy(Nom_fichier_initial,Principal_Nom_fichier); + strcpy(Commentaire_initial,Principal_Commentaire); + if (load) + { + if (image) + Ouvrir_fenetre(310,187+FILENAMESPACE,"Load picture"); + else + Ouvrir_fenetre(310,187+FILENAMESPACE,"Load brush"); + Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Load",0,1,SDLK_RETURN); // 1 + } + else + { + if (image) + Ouvrir_fenetre(310,187+FILENAMESPACE,"Save picture"); + else + Ouvrir_fenetre(310,187+FILENAMESPACE,"Save brush"); + Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Save",0,1,SDLK_RETURN); // 1 + if (Principal_Format==0) // Correction du *.* + { + Principal_Format=Principal_Format_fichier; + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + } + + if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable + { + Principal_Format=FORMAT_PAR_DEFAUT; + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + } + // Affichage du commentaire + if (FormatFichier[Principal_Format-1].Commentaire) + Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); + } + + Fenetre_Definir_bouton_normal(125,139+FILENAMESPACE,51,14,"Cancel",0,1,TOUCHE_ESC); // 2 + Fenetre_Definir_bouton_normal(125, 89+FILENAMESPACE,51,14,"Delete",0,1,SDLK_DELETE); // 3 + + // Cadre autour des formats + Fenetre_Afficher_cadre( 7, 51,104, 35); + // Cadre autour des infos sur le fichier de dessin + Fenetre_Afficher_cadre(116, 51,187, 35); + // Cadre autour de la preview + Fenetre_Afficher_cadre_creux(179,88+FILENAMESPACE,124,84); + // Cadre autour du fileselector + Fenetre_Afficher_cadre_creux( 7,88+FILENAMESPACE,100,84); + + Fenetre_Definir_bouton_special(9,90+FILENAMESPACE,96,80); // 4 + + // Scroller du fileselector + Scroller_de_fichiers = Fenetre_Definir_bouton_scroller(110,89+FILENAMESPACE,82,1,10,0); // 5 + + // Dropdown pour les formats de fichier + Dropdown_des_formats= + Fenetre_Definir_bouton_dropdown(70,56,36,16,0, + (Principal_Format==0)?"*.*":FormatFichier[Principal_Format-1].Extension, + 1,0,1,A_DROITE|A_GAUCHE); // 6 + if (load) + Fenetre_Dropdown_choix(Dropdown_des_formats,0,"*.*"); + for (Temp=0;TempPos_X+3,Dropdown_bookmark[Temp]->Pos_Y+2,5); + Afficher_bookmark(Dropdown_bookmark[Temp],Temp); + } + // On prend bien soin de passer dans le répertoire courant (le bon qui faut! Oui madame!) + if (load) + { + chdir(Principal_Repertoire_courant); + getcwd(Principal_Repertoire_courant,256); + } + else + { + chdir(Principal_Repertoire_fichier); + getcwd(Principal_Repertoire_courant,256); + } + + // Affichage des premiers fichiers visibles: + Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + + if (!load) + { + // On initialise le nom de fichier à celui en cours et non pas celui sous + // la barre de sélection + strcpy(Principal_Nom_fichier,Nom_fichier_initial); + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + } + + Pixel_de_chargement=Pixel_Chargement_dans_preview; + Nouvelle_preview=1; + Display_Window(310,(187+FILENAMESPACE)); + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case -1 : + case 0 : + break; + + case 1 : // Load ou Save + if(load) + { + // Determine the type + if(Fichier_existe(Principal_Nom_fichier)) + { + Type_selectionne = 0; + if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1; + } + else + { + Type_selectionne = 1; + } + } + else + { + if(Repertoire_existe(Principal_Nom_fichier)) Type_selectionne = 1; + else Type_selectionne = 0; + } + On_a_clicke_sur_OK=1; + break; + + case 2 : // Cancel + break; + + case 3 : // Delete + if (Liste_Nb_elements && (*Principal_Nom_fichier!='.') && Type_selectionne!=2) + { + char * Message; + Effacer_curseur(); + // On affiche une demande de confirmation + if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) + { + Message="Delete file ?"; + } + else + { + Message="Remove directory ?"; + } + if (Demande_de_confirmation(Message)) + { + // Si c'est un fichier + if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) + // On efface le fichier (si on peut) + Temp=(!remove(Principal_Nom_fichier)); + else // Si c'est un repertoire + // On efface le repertoire (si on peut) + Temp=(!rmdir(Principal_Nom_fichier)); + + if (Temp) // Temp indique si l'effacement s'est bien passé + { + // On remonte si c'était le dernier élément de la liste + if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1) + { + if (Principal_File_list_Position) + Principal_File_list_Position--; + else + if (Principal_File_list_Decalage) + Principal_File_list_Decalage--; + } + else // Si ce n'était pas le dernier, il faut faire gaffe à ce + { // que ses copains d'en dessous ne remontent pas trop. + if ( (Principal_File_list_Position) + && (Principal_File_list_Position+10==Liste_Nb_elements) ) + { + Principal_File_list_Position--; + Principal_File_list_Decalage++; + } + } + // On relit les informations + Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + // On demande la preview du nouveau fichier sur lequel on se trouve + Nouvelle_preview=1; + } + else + Erreur(0); + + // On place la barre de sélection du brouillon au début s'il a le + // même répertoire que l'image principale. + if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant)) + { + Brouillon_File_list_Position=0; + Brouillon_File_list_Decalage=0; + } + } + } + break; + + case 4 : // Zone d'affichage de la liste de fichiers + Effacer_curseur(); + + Temp=Calculer_decalage_click_dans_fileselector(); + if (Temp>=0) + { + if (Temp!=Principal_File_list_Decalage) + { + // On met à jour le décalage + Principal_File_list_Decalage=Temp; + + // On récupére le nom du schmilblick à "accéder" + Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier,&Type_selectionne); + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + // On affiche à nouveau la liste + Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage); + + // On vient de changer de nom de fichier, donc on doit s'appreter + // a rafficher une preview + Nouvelle_preview=1; + *Fichier_recherche=0; + } + else + { + // En sauvegarde, si on a double-clické sur un répertoire, il + // faut mettre le nom de fichier au nom du répertoire. Sinon, dans + // certains cas, on risque de sauvegarder avec le nom du fichier + // actuel au lieu de changer de répertoire. + if (Principal_File_list_Position+Principal_File_list_Decalage=10 && Bouton_clicke<10+NB_BOOKMARKS) + { + // Bookmark + char * Nom_repertoire; + + switch(Fenetre_Attribut2) + { + case -1: // bouton lui-même: aller au répertoire mémorisé + if (Config.Bookmark_directory[Bouton_clicke-10]) + { + *Fichier_recherche=0; + strcpy(Principal_Nom_fichier,Config.Bookmark_directory[Bouton_clicke-10]); + Type_selectionne=1; + On_a_clicke_sur_OK=1; + *Fichier_recherche=0; + } + break; + + case 0: // Set + if (Config.Bookmark_directory[Bouton_clicke-10]) + free(Config.Bookmark_directory[Bouton_clicke-10]); + Config.Bookmark_label[Bouton_clicke-10][0]='\0'; + Temp=strlen(Principal_Repertoire_courant); + Config.Bookmark_directory[Bouton_clicke-10]=malloc(Temp+1); + strcpy(Config.Bookmark_directory[Bouton_clicke-10],Principal_Repertoire_courant); + + Nom_repertoire=Position_dernier_slash(Principal_Repertoire_courant); + if (Nom_repertoire && Nom_repertoire[1]!='\0') + Nom_repertoire++; + else + Nom_repertoire=Principal_Repertoire_courant; + Temp=strlen(Nom_repertoire); + strncpy(Config.Bookmark_label[Bouton_clicke-10],Nom_repertoire,8); + if (Temp>8) + { + Config.Bookmark_label[Bouton_clicke-10][7]=CARACTERE_SUSPENSION; + Config.Bookmark_label[Bouton_clicke-10][8]='\0'; + } + Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); + break; + + case 1: // Rename + if (Config.Bookmark_directory[Bouton_clicke-10]) + { + // On enlève les "..." avant l'édition + char bookmark_label[8+1]; + strcpy(bookmark_label, Config.Bookmark_label[Bouton_clicke-10]); + if (bookmark_label[7]==CARACTERE_SUSPENSION) + bookmark_label[7]='\0'; + if (Readline_ex(Dropdown_bookmark[Bouton_clicke-10]->Pos_X+3+10,Dropdown_bookmark[Bouton_clicke-10]->Pos_Y+2,bookmark_label,8,8,0)) + strcpy(Config.Bookmark_label[Bouton_clicke-10],bookmark_label); + Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); + Afficher_curseur(); + } + break; + + case 2: // Clear + if (Config.Bookmark_directory[Bouton_clicke-10] && Demande_de_confirmation("Erase bookmark ?")) + { + free(Config.Bookmark_directory[Bouton_clicke-10]); + Config.Bookmark_directory[Bouton_clicke-10]=NULL; + Config.Bookmark_label[Bouton_clicke-10][0]='\0'; + Afficher_bookmark(Dropdown_bookmark[Bouton_clicke-10],Bouton_clicke-10); + } + break; + } + } + break; + } + + switch (Touche) + { + case SDLK_UNKNOWN : break; + case SDLK_DOWN : // Bas + *Fichier_recherche=0; + Effacer_curseur(); + Select_Scroll_Down(&Principal_File_list_Position,&Principal_File_list_Decalage); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_UP : // Haut + *Fichier_recherche=0; + Effacer_curseur(); + Select_Scroll_Up(&Principal_File_list_Position,&Principal_File_list_Decalage); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_PAGEDOWN : // PageDown + *Fichier_recherche=0; + Effacer_curseur(); + Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,9); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_PAGEUP : // PageUp + *Fichier_recherche=0; + Effacer_curseur(); + Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,9); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_END : // End + *Fichier_recherche=0; + Effacer_curseur(); + Select_End(&Principal_File_list_Position,&Principal_File_list_Decalage); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_HOME : // Home + *Fichier_recherche=0; + Effacer_curseur(); + Select_Home(&Principal_File_list_Position,&Principal_File_list_Decalage); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case TOUCHE_MOUSEWHEELDOWN : + *Fichier_recherche=0; + Effacer_curseur(); + Select_Page_Down(&Principal_File_list_Position,&Principal_File_list_Decalage,3); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case TOUCHE_MOUSEWHEELUP : + *Fichier_recherche=0; + Effacer_curseur(); + Select_Page_Up(&Principal_File_list_Position,&Principal_File_list_Decalage,3); + On_vient_de_scroller_dans_le_fileselect(Scroller_de_fichiers); + Touche=0; + break; + case SDLK_BACKSPACE : // Backspace + *Fichier_recherche=0; + // Si le choix ".." est bien en tête des propositions... + if (!strcmp(Liste_du_fileselect->NomComplet,PARENT_DIR)) + { + // On va dans le répertoire parent. + strcpy(Principal_Nom_fichier,PARENT_DIR); + Type_selectionne=1; + On_a_clicke_sur_OK=1; + } + Touche=0; + break; + default: // Autre => On se place sur le nom de fichier qui correspond + if (Bouton_clicke<=0) + { + if (Est_Raccourci(Touche,0x100+BOUTON_AIDE)) + { + Fenetre_aide(load?BOUTON_CHARGER:BOUTON_SAUVER, NULL); + break; + } + Temp=strlen(Fichier_recherche); + if (Touche_ANSI>= ' ' && Touche_ANSI < 255 && Temp<50) + { + Fichier_recherche[Temp]=Touche_ANSI; + Fichier_recherche[Temp+1]='\0'; + Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche); + if ( (Fichier_le_plus_ressemblant) ) + { + Temp=Principal_File_list_Position+Principal_File_list_Decalage; + Effacer_curseur(); + Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant); + Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + Afficher_curseur(); + if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage) + Nouvelle_preview=1; + } + else + *Fichier_recherche=0; + Touche=0; + } + } + else + *Fichier_recherche=0; + } + + if (On_a_clicke_sur_OK) + { + // Si c'est un répertoire, on annule "On_a_clicke_sur_OK" et on passe + // dedans. + if (Type_selectionne!=0) + { + Effacer_curseur(); + On_a_clicke_sur_OK=0; + + // On mémorise le répertoire dans lequel on était + if (strcmp(Principal_Nom_fichier,PARENT_DIR)) + strcpy(Repertoire_precedent,Nom_formate(PARENT_DIR, 1)); + else + { + strcpy(Repertoire_precedent, + Nom_formate(Position_dernier_slash(Principal_Repertoire_courant), 1) + ); + } + + // On doit rentrer dans le répertoire: + if (!chdir(Principal_Nom_fichier)) + { + getcwd(Principal_Repertoire_courant,256); + + // On lit le nouveau répertoire + Lire_liste_des_fichiers(Principal_Format); + Trier_la_liste_des_fichiers(); + // On place la barre de sélection sur le répertoire d'où l'on vient + Placer_barre_de_selection_sur(Repertoire_precedent); + } + else + Erreur(0); + // Affichage des premiers fichiers visibles: + Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + Afficher_curseur(); + Nouvelle_preview=1; + } + else // Sinon on essaye de charger ou sauver le fichier + { + strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); + if (!load) + Principal_Format_fichier=Principal_Format; + Charger_ou_sauver_l_image=1; + } + } + + // Gestion du chrono et des previews + if (Nouvelle_preview) + { + // On efface les infos de la preview précédente s'il y en a une + // d'affichée + if (Etat_chrono==2) + { + Effacer_curseur(); + // On efface le commentaire précédent + Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y, + Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); + // On nettoie la zone où va s'afficher la preview: + Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y, + Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair); + // On efface les dimensions de l'image + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // On efface la taille du fichier + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // On efface le format du fichier + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 72*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // Affichage du commentaire + if ( (!load) && (FormatFichier[Principal_Format-1].Commentaire) ) + { + Print_dans_fenetre(46,175+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); + } + Afficher_curseur(); + // Un update pour couvrir les 4 zones: 3 libellés plus la zone de preview + UpdateRect(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+55*Menu_Facteur_Y,Menu_Facteur_X*122,Menu_Facteur_Y*(116+FILENAMESPACE)); + // Zone de commentaire + UpdateRect(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+(175+FILENAMESPACE)*Menu_Facteur_Y,Menu_Facteur_X*32*8,Menu_Facteur_Y*8); + } + + Nouvelle_preview=0; + Etat_chrono=0; // Etat du chrono = Attente d'un Xème de seconde + // On lit le temps de départ du chrono + Initialiser_chrono(Config.Chrono_delay); + } + + if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder + Tester_chrono(); // s'il ne faut pas afficher la preview + + if (Etat_chrono==1) // Il faut afficher la preview + { + if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) ) + { + strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); + + Effacer_curseur(); + Charger_image(image); + UpdateRect(ToWinX(179),ToWinY(88+FILENAMESPACE),ToWinL(124),ToWinH(84)); + Afficher_curseur(); + + // Après le chargement de la preview, on restaure tout ce qui aurait + // pu être modifié par le chargement de l'image: + memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); + Principal_Image_modifiee=Image_modifiee_initiale; + Principal_Largeur_image=Largeur_image_initiale; + Principal_Hauteur_image=Hauteur_image_initiale; + } + + Etat_chrono=2; // On arrête le chrono + } + } + while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) ); + + // Si on annule, on restaure l'ancien commentaire + if (Bouton_clicke==2) + strcpy(Principal_Commentaire,Commentaire_initial); + + // On restaure les données de l'image qui ont certainement été modifiées + // par la preview. + memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); + Set_palette(Principal_Palette); + Back_color=Back_color_initiale; + Principal_Image_modifiee=Image_modifiee_initiale; + Principal_Largeur_image=Largeur_image_initiale; + Principal_Hauteur_image=Hauteur_image_initiale; + Set_palette(Principal_Palette); + + Calculer_couleurs_menu_optimales(Principal_Palette); + Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y) #include -#include -#include #include #include #include @@ -62,7 +60,6 @@ #include "clavier.h" #include "io.h" #include "hotkeys.h" -#include "files.h" #include "setup.h" #include "windows.h" #include "sdlscreen.h" @@ -1665,14 +1662,12 @@ int Charger_CFG(int Tout_charger) Config_Chunk Chunk; Config_Infos_touche CFG_Infos_touche; Config_Mode_video CFG_Mode_video; - struct stat Informations_Fichier; int Conversion_touches = 0; strcpy(Nom_du_fichier,Repertoire_de_configuration); strcat(Nom_du_fichier,"gfx2.cfg"); - stat(Nom_du_fichier,&Informations_Fichier); - Taille_fichier=Informations_Fichier.st_size; + Taille_fichier=FileLength(Nom_du_fichier); if ((Handle=fopen(Nom_du_fichier,"rb"))==NULL) return ERREUR_CFG_ABSENT; @@ -1954,8 +1949,8 @@ int Sauver_CFG(void) char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; Config_Header cfg_header; Config_Chunk Chunk; - Config_Infos_touche CFG_Infos_touche; - Config_Mode_video CFG_Mode_video; + Config_Infos_touche CFG_Infos_touche={0,0,0}; + Config_Mode_video CFG_Mode_video={0,0,0}; strcpy(Nom_du_fichier,Repertoire_de_configuration); strcat(Nom_du_fichier,"gfx2.cfg"); diff --git a/io.c b/io.c index 42d918a6..5bf028cc 100644 --- a/io.c +++ b/io.c @@ -241,3 +241,45 @@ int Repertoire_existe(char * Repertoire) } } } + +// Taille de fichier, en octets +int FileLength(const char * fname) +{ + struct stat infos_fichier; + if (stat(fname,&infos_fichier)) + return 0; + return infos_fichier.st_size; +} +int File_length_file(FILE * file) +{ + struct stat infos_fichier; + if (fstat(fileno(file),&infos_fichier)) + return 0; + return infos_fichier.st_size; +} + +void for_each_file(const char * Nom_repertoire, void Callback(const char *)) +{ + // Pour scan de répertoire + DIR* Repertoire_Courant; //Répertoire courant + struct dirent* entry; // Structure de lecture des éléments + char Nom_fichier_complet[TAILLE_CHEMIN_FICHIER]; + int Position_nom_fichier; + strcpy(Nom_fichier_complet, Nom_repertoire); + Repertoire_Courant=opendir(Nom_repertoire); + if(Repertoire_Courant == NULL) return; // Répertoire invalide ... + strcat(Nom_fichier_complet, SEPARATEUR_CHEMIN); + Position_nom_fichier = strlen(Nom_fichier_complet); + while ((entry=readdir(Repertoire_Courant))) + { + struct stat Infos_enreg; + strcpy(&Nom_fichier_complet[Position_nom_fichier], entry->d_name); + stat(Nom_fichier_complet,&Infos_enreg); + if (S_ISREG(Infos_enreg.st_mode)) + { + Callback(Nom_fichier_complet); + } + } + closedir(Repertoire_Courant); +} + diff --git a/io.h b/io.h index 0707d6da..2b5cb468 100644 --- a/io.h +++ b/io.h @@ -49,9 +49,18 @@ char * Position_dernier_slash(const char * Chaine); #define SEPARATEUR_CHEMIN "/" #endif +// Taille de fichier, en octets +int FileLength(const char *fname); + +// Taille de fichier, en octets +int File_length_file(FILE * file); + // Détermine si un file passé en paramètre existe ou non dans le // répertoire courant. int Fichier_existe(char * fname); // Détermine si un répertoire passé en paramètre existe ou non dans le // répertoire courant. int Repertoire_existe(char * Repertoire); + +// Scans a directory, calls Callback for each file in it, +void for_each_file(const char * Nom_repertoire, void Callback(const char *)); diff --git a/loadsave.c b/loadsave.c index da71e07d..a6a7d2d9 100644 --- a/loadsave.c +++ b/loadsave.c @@ -23,7 +23,6 @@ #define _XOPEN_SOURCE #include -#include #include #include #include @@ -137,14 +136,6 @@ T_Format FormatFichier[NB_FORMATS_CONNUS] = { // Actuellement seul le format PNG peut donner autre chose que PIXEL_SIMPLE. enum PIXEL_RATIO Ratio_image_chargee=PIXEL_SIMPLE; -// Taille de fichier, en octets -int FileLength(FILE * file) -{ - struct stat infos_fichier; - fstat(fileno(file),&infos_fichier); - return infos_fichier.st_size; -} - // Chargement des pixels dans l'écran principal void Pixel_Chargement_dans_ecran_courant(word x_pos,word y_pos,byte Couleur) { @@ -731,7 +722,6 @@ void Test_PAL(void) FILE *file; // Fichier du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier long Taille_du_fichier; // Taille du fichier - struct stat Informations_Fichier; Nom_fichier_complet(Nom_du_fichier,0); @@ -740,9 +730,8 @@ void Test_PAL(void) // Ouverture du fichier if ((file=fopen(Nom_du_fichier, "rb"))) { - stat(Nom_du_fichier,&Informations_Fichier); // Lecture de la taille du fichier - Taille_du_fichier=Informations_Fichier.st_size; + Taille_du_fichier=File_length_file(file); fclose(file); // Le fichier ne peut être au format PAL que si sa taille vaut 768 octets if (Taille_du_fichier==sizeof(T_Palette)) @@ -884,17 +873,13 @@ void Load_IMG(void) long Largeur_lue; long Taille_du_fichier; T_Header_IMG IMG_header; - struct stat Informations_Fichier; - - stat(Nom_du_fichier,&Informations_Fichier); - Nom_fichier_complet(Nom_du_fichier,0); Erreur_fichier=0; if ((file=fopen(Nom_du_fichier, "rb"))) { - Taille_du_fichier=Informations_Fichier.st_size; + Taille_du_fichier=File_length_file(file); if (read_bytes(file,&IMG_header,sizeof(T_Header_IMG))) { @@ -1068,8 +1053,6 @@ void Load_PKM(void) dword Taille_image; dword Taille_pack; long Taille_du_fichier; - struct stat Informations_Fichier; - Nom_fichier_complet(Nom_du_fichier,0); @@ -1077,8 +1060,7 @@ void Load_PKM(void) if ((file=fopen(Nom_du_fichier, "rb"))) { - stat(Nom_du_fichier,&Informations_Fichier); - Taille_du_fichier=Informations_Fichier.st_size; + Taille_du_fichier=File_length_file(file); if (read_bytes(file,&header,sizeof(T_Header_PKM))) { @@ -1197,7 +1179,7 @@ void Load_PKM(void) Compteur_de_donnees_packees=0; Compteur_de_pixels=0; - Taille_pack=(Informations_Fichier.st_size)-sizeof(T_Header_PKM)-header.Jump; + Taille_pack=(Taille_du_fichier)-sizeof(T_Header_PKM)-header.Jump; // Boucle de décompression: while ( (Compteur_de_pixels Clear tables word Valeur_Eof; // Valeur <=> Fin d'image long Taille_du_fichier; - struct stat Informations_Fichier; int Nombre_LID; // Nombre d'images trouvées dans le fichier /////////////////////////////////////////////////// FIN DES DECLARATIONS // @@ -2865,9 +2840,7 @@ void Load_GIF(void) if ((GIF_Fichier=fopen(Nom_du_fichier, "rb"))) { - stat(Nom_du_fichier,&Informations_Fichier); - Taille_du_fichier=Informations_Fichier.st_size; - + Taille_du_fichier=File_length_file(GIF_Fichier); if ( (read_bytes(GIF_Fichier,signature,6)) && ( (memcmp(signature,"GIF87a",6)==0) || (memcmp(signature,"GIF89a",6)==0) ) ) @@ -3631,7 +3604,6 @@ void Load_PCX(void) long position; long Taille_image; byte * Buffer; - struct stat Informations_Fichier; Nom_fichier_complet(Nom_du_fichier,0); @@ -3639,8 +3611,7 @@ void Load_PCX(void) if ((file=fopen(Nom_du_fichier, "rb"))) { - stat(Nom_du_fichier,&Informations_Fichier); - Taille_du_fichier=Informations_Fichier.st_size; + Taille_du_fichier=File_length_file(file); /* if (read_bytes(file,&PCX_header,sizeof(T_PCX_Header))) {*/ @@ -4086,15 +4057,17 @@ void Test_CEL(void) FILE *file; T_CEL_Header1 header1; T_CEL_Header2 header2; - struct stat Informations_Fichier; + int Taille_fichier; Erreur_fichier=0; - if (!stat(Nom_du_fichier,&Informations_Fichier)) + Nom_fichier_complet(Nom_du_fichier,0); + Taille_fichier=FileLength(Nom_du_fichier); + if (Taille_fichier==0) { Erreur_fichier = 1; // Si on ne peut pas faire de stat il vaut mieux laisser tomber return; } - Nom_fichier_complet(Nom_du_fichier,0); + if (! (file=fopen(Nom_du_fichier, "rb"))) { Erreur_fichier = 1; @@ -4106,7 +4079,7 @@ void Test_CEL(void) // Vu que ce header n'a pas de signature, il va falloir tester la // cohérence de la dimension de l'image avec celle du fichier. - size=(Informations_Fichier.st_size)-sizeof(T_CEL_Header1); + size=Taille_fichier-sizeof(T_CEL_Header1); if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) ) { // Tentative de reconnaissance de la signature des nouveaux fichiers @@ -4152,17 +4125,14 @@ void Load_CEL(void) short y_pos; byte Dernier_octet=0; long Taille_du_fichier; - struct stat Informations_Fichier; - Erreur_fichier=0; - stat(Nom_du_fichier,&Informations_Fichier); Nom_fichier_complet(Nom_du_fichier,0); if ((file=fopen(Nom_du_fichier, "rb"))) { if (read_bytes(file,&header1,sizeof(T_CEL_Header1))) { - Taille_du_fichier=Informations_Fichier.st_size; + Taille_du_fichier=File_length_file(file); if ( (Taille_du_fichier>(long int)sizeof(T_CEL_Header1)) && ( (((header1.Width+1)>>1)*header1.Height)==(Taille_du_fichier-(long int)sizeof(T_CEL_Header1)) ) ) { @@ -4403,7 +4373,7 @@ void Test_KCF(void) Nom_fichier_complet(Nom_du_fichier,0); if ((file=fopen(Nom_du_fichier, "rb"))) { - if (FileLength(file)==sizeof(T_KCF_Header)) + if (File_length_file(file)==sizeof(T_KCF_Header)) { read_bytes(file,&Buffer,sizeof(T_KCF_Header)); // On vérifie une propriété de la structure de palette: @@ -4453,7 +4423,7 @@ void Load_KCF(void) Nom_fichier_complet(Nom_du_fichier,0); if ((file=fopen(Nom_du_fichier, "rb"))) { - Taille_du_fichier=FileLength(file); + Taille_du_fichier=File_length_file(file); if (Taille_du_fichier==sizeof(T_KCF_Header)) { // Fichier KCF à l'ancien format @@ -4690,7 +4660,7 @@ void Load_SCx(void) if ((file=fopen(Nom_du_fichier, "rb"))) { - Taille_du_fichier=FileLength(file); + Taille_du_fichier=File_length_file(file); if ((read_bytes(file,&SCx_header,sizeof(T_SCx_Header)))) { @@ -4953,7 +4923,7 @@ void Test_PI1(void) if ((file=fopen(Nom_du_fichier, "rb"))) { // Vérification de la taille - size=FileLength(file); + size=File_length_file(file); if ((size==32034) || (size==32066)) { // Lecture et vérification de la résolution @@ -4992,7 +4962,7 @@ void Load_PI1(void) if (read_bytes(file,buffer,32034)) { // Initialisation de la preview - Initialiser_preview(320,200,FileLength(file),FORMAT_PI1); + Initialiser_preview(320,200,File_length_file(file),FORMAT_PI1); if (Erreur_fichier==0) { // Initialisation de la palette @@ -5283,7 +5253,7 @@ void Test_PC1(void) if ((file=fopen(Nom_du_fichier, "rb"))) { // Vérification de la taille - size=FileLength(file); + size=File_length_file(file); if ((size<=32066)) { // Lecture et vérification de la résolution @@ -5316,7 +5286,7 @@ void Load_PC1(void) Erreur_fichier=0; if ((file=fopen(Nom_du_fichier, "rb"))) { - size=FileLength(file); + size=File_length_file(file); // allocation des buffers mémoire buffercomp=(byte *)malloc(size); bufferdecomp=(byte *)malloc(32000); @@ -5326,7 +5296,7 @@ void Load_PC1(void) if (read_bytes(file,buffercomp,size)) { // Initialisation de la preview - Initialiser_preview(320,200,FileLength(file),FORMAT_PC1); + Initialiser_preview(320,200,File_length_file(file),FORMAT_PC1); if (Erreur_fichier==0) { // Initialisation de la palette @@ -5588,8 +5558,6 @@ void Load_PNG(void) char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier byte PNG_header[8]; dword Taille_image; - long Taille_du_fichier; - struct stat Informations_Fichier; png_structp png_ptr; png_infop info_ptr; @@ -5600,9 +5568,6 @@ void Load_PNG(void) if ((file=fopen(Nom_du_fichier, "rb"))) { - stat(Nom_du_fichier,&Informations_Fichier); - Taille_du_fichier=Informations_Fichier.st_size; - if (read_bytes(file,PNG_header,8)) { if ( !png_sig_cmp(PNG_header, 0, 8)) @@ -5667,7 +5632,7 @@ void Load_PNG(void) } } } - Initialiser_preview(info_ptr->width,info_ptr->height,Taille_du_fichier,FORMAT_PNG); + Initialiser_preview(info_ptr->width,info_ptr->height,File_length_file(file),FORMAT_PNG); if (Erreur_fichier==0) { diff --git a/main.c b/main.c index b1ad9ebf..507bb713 100644 --- a/main.c +++ b/main.c @@ -40,7 +40,6 @@ #include "boutons.h" #include "moteur.h" #include "pages.h" -#include "files.h" #include "loadsave.h" #include "sdlscreen.h" #include "erreurs.h" @@ -313,7 +312,7 @@ int Initialisation_du_programme(int argc,char * argv[]) Set_Config_Directory(Repertoire_du_programme,Repertoire_de_configuration); // On détermine le répertoire courant: - Determiner_repertoire_courant(); + getcwd(Principal_Repertoire_courant,256); // On en profite pour le mémoriser dans le répertoire principal: strcpy(Repertoire_initial,Principal_Repertoire_courant); diff --git a/setup.c b/setup.c index cb036b9e..91755570 100644 --- a/setup.c +++ b/setup.c @@ -39,7 +39,6 @@ #include "struct.h" #include "io.h" -#include "files.h" int Create_ConfigDirectory(char * Config_Dir) { diff --git a/texte.c b/texte.c index 158e15d2..5f127a9d 100644 --- a/texte.c +++ b/texte.c @@ -55,7 +55,6 @@ #include "global.h" #include "sdlscreen.h" #include "io.h" -#include "files.h" typedef struct T_FONTE { diff --git a/windows.h b/windows.h index 8d9d18b5..c80bce4f 100644 --- a/windows.h +++ b/windows.h @@ -24,6 +24,13 @@ #include "struct.h" +#define ToWinX(x) (((x)*Menu_Facteur_X)+Fenetre_Pos_X) +#define ToWinY(y) (((y)*Menu_Facteur_Y)+Fenetre_Pos_Y) +#define ToWinL(l) ((l)*Menu_Facteur_X) +#define ToWinH(h) ((h)*Menu_Facteur_Y) + +#define Display_Window(x,y) UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,(x)*Menu_Facteur_X,(y)*Menu_Facteur_Y); + void Afficher_curseur(void); void Effacer_curseur(void);