From 646ac6235f24cdbd97b0f66f8060f5b908606cf7 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Mon, 15 Sep 2008 21:00:11 +0000 Subject: [PATCH] Save/Load: Added drive icons (also linux, but untested) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@153 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 33 +++++----- const.h | 10 ++-- init.c | 176 ++++++++++++++++++++---------------------------------- init.h | 1 + struct.h | 1 + 5 files changed, 90 insertions(+), 131 deletions(-) diff --git a/boutons.c b/boutons.c index f63f1856..274b53c9 100644 --- a/boutons.c +++ b/boutons.c @@ -2611,21 +2611,26 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) Afficher_curseur(); break; default : // Drives - Effacer_curseur(); // On change de lecteur: Lecteur = Drive[Bouton_clicke-9].Lettre-64 - /* A revoir ... - _dos_setdrive(Drive[Bouton_clicke-9].Lettre-64,&Bidon); - */ - // On lit le répertoire courant de ce lecteur - Determiner_repertoire_courant(); - // Comme on tombe sur un disque qu'on connait pas, on se place en - // début de liste: - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - // Affichage des premiers fichiers visibles: - Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - Afficher_curseur(); - Nouvelle_preview=1; + if (! ActiverLecteur(Bouton_clicke-9)) + { + Effacer_curseur(); + // On lit le répertoire courant de ce lecteur + Determiner_repertoire_courant(); + // Comme on tombe sur un disque qu'on connait pas, on se place en + // début de liste: + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + // Affichage des premiers fichiers visibles: + Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + Afficher_curseur(); + Nouvelle_preview=1; + } + else + { + // Un ptit flash rouge pour signaler le lecteur invalide. + Erreur(0); + } } switch (Touche) diff --git a/const.h b/const.h index e6d9c0eb..935bd736 100644 --- a/const.h +++ b/const.h @@ -276,11 +276,11 @@ enum CHUNKS_CFG enum TYPES_DE_LECTEURS { - DRIVE_FLOPPY_3_5, // 0: Diskette 3"« - DRIVE_FLOPPY_5_25, // 1: Diskette 5"¬ - DRIVE_HDD, // 2: HDD - DRIVE_CDROM, // 3: CD-ROM - DRIVE_NETWORK // 4: Logique (réseau?) + LECTEUR_FLOPPY_3_5, // 0: Diskette 3"« + LECTEUR_FLOPPY_5_25, // 1: Diskette 5"¬ + LECTEUR_HDD, // 2: HDD + LECTEUR_CDROM, // 3: CD-ROM + LECTEUR_NETWORK // 4: Logique (réseau?) }; // Les différents boutons: diff --git a/init.c b/init.c index 6255dd82..7cfbe928 100644 --- a/init.c +++ b/init.c @@ -24,6 +24,10 @@ #include "errno.h" +#ifndef __linux__ +#include "windows.h" +#endif + // Chercher le répertoire contenant GFX2.EXE void Chercher_repertoire_du_programme(char * Chaine) { @@ -68,9 +72,9 @@ word Drive_Touche[26]= }; // Ajouter un lecteur à la liste de lecteurs -void Ajouter_lecteur(byte Numero, byte Type) +void Ajouter_lecteur(byte Numero, char Lettre, byte Type) { - Drive[Nb_drives].Lettre=Numero+65; + Drive[Nb_drives].Lettre=Lettre; Drive[Nb_drives].Type =Type; Drive[Nb_drives].Touche=Drive_Touche[Numero]; @@ -81,120 +85,68 @@ void Ajouter_lecteur(byte Numero, byte Type) // Rechercher la liste et le type des lecteurs de la machine void Rechercher_drives(void) { -/* - byte Lecteur; - byte Nb_lecteurs_disquettes; - byte Lecteur_de_disquettes; - byte Type_de_lecteur=42; - //char Bidon[256]; + int DriveBits = GetLogicalDrives(); + int IndiceLecteur; + int IndiceBit; - Nb_drives=0; - Nb_lecteurs_disquettes=(Type_de_lecteur_de_disquette(0)>0)+(Type_de_lecteur_de_disquette(1)>0); - - // Test du type des lecteurs A: et B: - if (Nb_lecteurs_disquettes==2) - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 1 : - case 2 : - Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_5_25); - break; - default: - Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_3_5); + #ifdef __linux__ + //Sous linux, il n'y a pas de lecteurs, on va juste mettre + // un disque dur qui pointera vers la racine, + // et un autre vers le home directory de l'utilisateur. + Ajouter_lecteur(0,'/', LECTEUR_HDD); + Ajouter_lecteur(1,'~', LECTEUR_HDD); + #else + // Sous Windows, on a la totale, presque aussi bien que sous DOS: + IndiceLecteur = 0; + for (IndiceBit=0; IndiceBit<26 && IndiceLecteur<23; IndiceBit++) + { + if ( (1 << IndiceBit) & DriveBits ) + { + // On a ce lecteur, il faut maintenant déterminer son type "physique". + // pour profiter des jolies icones de X-man. + int TypeLecteur; + char CheminLecteur[]="A:\\"; + // Cette API Windows est étrange, je dois m'y faire... + CheminLecteur[0]='A'+IndiceBit; + switch (GetDriveType(CheminLecteur)) + { + case DRIVE_CDROM: + TypeLecteur=LECTEUR_CDROM; + break; + case DRIVE_REMOTE: + TypeLecteur=LECTEUR_NETWORK; + break; + case DRIVE_REMOVABLE: + TypeLecteur=LECTEUR_FLOPPY_3_5; + break; + case DRIVE_FIXED: + TypeLecteur=LECTEUR_HDD; + break; + default: + TypeLecteur=LECTEUR_NETWORK; + break; + } + Ajouter_lecteur(IndiceBit, 'A'+IndiceBit, TypeLecteur); + IndiceLecteur++; } - } - else // On n'a pas 2 lecteurs donc on regarde si "logiquement" c'est A: ou B: - if (Nb_lecteurs_disquettes==1) - { - if (Disk_map(2)==Disk_map(1)) - { - // Il n'y a pas de lecteur émulé par un SUBST - Lecteur_de_disquettes=Disk_map(1)-1; - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 0 : - break; - case 1 : - case 2 : - Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_5_25); - break; - default: - Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_3_5); - } - } - } - else - { - // Il y a un lecteur émulé par un SUBST - Lecteur_de_disquettes=Disk_map(1)-1; - - // On cherche d'abord sur quel lecteur le lecteur physique est dispo - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Type_de_lecteur_de_disquette(Lecteur)) - { - case 0 : - break; - case 1 : - case 2 : - Type_de_lecteur=DRIVE_FLOPPY_5_25; - break; - default: - Type_de_lecteur=DRIVE_FLOPPY_3_5; - } - } - - // On déclare les trucs maintenant - if (Lecteur_de_disquettes==0) - { - // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé - Ajouter_lecteur(0,Type_de_lecteur); - Ajouter_lecteur(1,DRIVE_NETWORK); - } - else - { - // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé - Ajouter_lecteur(0,DRIVE_NETWORK); - Ajouter_lecteur(1,Type_de_lecteur); - } - } - } - else - // Il n'y a pas de lecteur de D7 physique, mais on vérifie s'il n'y en a - // pas qui seraient émulés par SUBST - for (Lecteur=0; Lecteur<=1; Lecteur++) - { - switch (Freespace(Lecteur+1)) - { - case -1: - break; - default: - Ajouter_lecteur(Lecteur,DRIVE_NETWORK); - } - } - - // Test de la présence d'autres lecteurs (HDD, CD, Réseau) - // On les met tous en réseau avant de tester leur vrai type. - for (Lecteur=2; Lecteur<=25; Lecteur++) - { - if (Disque_dur_present(Lecteur-2)) - Ajouter_lecteur(Lecteur,DRIVE_HDD); - else - if (Lecteur_CDROM_present(Lecteur)) - Ajouter_lecteur(Lecteur,DRIVE_CDROM); - else - if (Freespace(Lecteur+1)!=-1) - Ajouter_lecteur(Lecteur,DRIVE_NETWORK); - } -*/ - //Sous linux, il n'y a pas de lecteurs, on va juste mettre un disque dur qui pointera vers la racine - Ajouter_lecteur(0,DRIVE_HDD); //Le lecteur numéro 0 est un disque dur. + } + #endif } +// Active un lecteur, changeant normalement le répertoire en cours. +// Renvoie 0 si ok, -1 si problème. +int ActiverLecteur(int NumeroLecteur) +{ + #ifdef __linux__ + char NomLecteur[]=" "; + NomLecteur[0]=Drive[NumeroLecteur].Lettre; + return chdir(NomLecteur); + #else + char NomLecteur[]="A:\\"; + NomLecteur[0]=Drive[NumeroLecteur].Lettre; + return ! SetCurrentDirectory(NomLecteur); + #endif +} // Fonction de décryptage diff --git a/init.h b/init.h index dc456cee..a4bc491b 100644 --- a/init.h +++ b/init.h @@ -10,3 +10,4 @@ void Initialiser_la_table_des_carres(void); void Initialiser_la_table_precalculee_des_distances_de_couleur(void); void Definition_des_modes_video(void); +int ActiverLecteur(int); diff --git a/struct.h b/struct.h index 0b468a51..2f644f3f 100644 --- a/struct.h +++ b/struct.h @@ -87,6 +87,7 @@ struct T_Drive char Lettre; byte Type; // 0: Diskette 3"« / 1: Diskette 5"¬ / 2: HDD / 3: CD-ROM / 4: Logique word Touche; + char Chemin[4]; // Reservé pour "x:\", ou "/", ou "~" };