Save/Load: (linux) .. now appears, and options "Show hidden files" and "Show hidden dirs" now work.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@164 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2008-09-25 18:24:26 +00:00
parent ca8be4e399
commit 51a4b91b91
2 changed files with 43 additions and 50 deletions

53
files.c
View File

@ -18,7 +18,7 @@
#ifdef __linux__ #ifdef __linux__
#include <dirent.h> #include <dirent.h>
#define isHidden(Enreg) ((Enreg)->d_name[0]=='.' && (Enreg)->d_name[1]!='\0') #define isHidden(Enreg) ((Enreg)->d_name[0]=='.')
#elif defined(__WATCOMC__) #elif defined(__WATCOMC__)
#include <direct.h> #include <direct.h>
#define isHidden(Enreg) ((Enreg)->d_attr & _A_HIDDEN) #define isHidden(Enreg) ((Enreg)->d_attr & _A_HIDDEN)
@ -92,7 +92,7 @@ int Fichier_existe(char * Fichier)
// Conventions: // Conventions:
// //
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir // * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
// qu'un findfirst dans le répertoire courant faire: // qu'un findfirst dans le répertoire courant à faire:
// -- Déstruction de la liste chaŒnée --------------------------------------- // -- Déstruction de la liste chaŒnée ---------------------------------------
@ -170,6 +170,7 @@ char * Nom_formate(char * Nom)
void Ajouter_element_a_la_liste(struct dirent* Enreg) void Ajouter_element_a_la_liste(struct dirent* Enreg)
// Cette procedure ajoute a la liste chainee un fichier passé en argument. // Cette procedure ajoute a la liste chainee un fichier passé en argument.
{ {
struct stat Infos_enreg;
// Pointeur temporaire d'insertion // Pointeur temporaire d'insertion
struct Element_de_liste_de_fileselect * Element_temporaire; struct Element_de_liste_de_fileselect * Element_temporaire;
@ -179,15 +180,8 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg)
// On met a jour le nouvel emplacement: // On met a jour le nouvel emplacement:
strcpy(Element_temporaire->NomAbrege,Nom_formate(Enreg->d_name)); strcpy(Element_temporaire->NomAbrege,Nom_formate(Enreg->d_name));
strcpy(Element_temporaire->NomComplet,Enreg->d_name); strcpy(Element_temporaire->NomComplet,Enreg->d_name);
#ifdef __linux__
Element_temporaire->Type = (Enreg->d_type == DT_DIR);
#elif __WATCOMC__
Element_temporaire->Type = (Enreg->d_attr & _A_SUBDIR);
#else
struct stat Infos_enreg;
stat(Enreg->d_name,&Infos_enreg); stat(Enreg->d_name,&Infos_enreg);
Element_temporaire->Type = S_ISDIR(Infos_enreg.st_mode); Element_temporaire->Type = S_ISDIR(Infos_enreg.st_mode);
#endif
Element_temporaire->Suivant =Liste_du_fileselect; Element_temporaire->Suivant =Liste_du_fileselect;
Element_temporaire->Precedent=NULL; Element_temporaire->Precedent=NULL;
@ -252,24 +246,29 @@ void Lire_liste_des_fichiers(byte Format_demande)
// On lit tous les répertoires: // On lit tous les répertoires:
Repertoire_Courant=opendir(getcwd(NULL,0)); Repertoire_Courant=opendir(getcwd(NULL,0));
Enreg=readdir(Repertoire_Courant); while ((Enreg=readdir(Repertoire_Courant)))
while (Enreg)
{ {
// Si l'élément n'est pas le répertoire courant // On ignore le répertoire courant
if ( (Enreg->d_name[0]!='.') || (Enreg->d_name[1] != 0)) if ( !strcmp(Enreg->d_name, "."))
{ {
continue;
}
stat(Enreg->d_name,&Infos_enreg); stat(Enreg->d_name,&Infos_enreg);
// et que l'élément trouvé est un répertoire // et que l'élément trouvé est un répertoire
if( S_ISDIR(Infos_enreg.st_mode) && if( S_ISDIR(Infos_enreg.st_mode) &&
// et qu'il n'est pas caché // et que c'est ".."
((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches)) (!strcmp(Enreg->d_name, "..") ||
// ou qu'il n'est pas caché
Config.Lire_les_repertoires_caches ||
!isHidden(Enreg)))
{ {
// On rajoute le répertore à la liste // On rajoute le répertore à la liste
Ajouter_element_a_la_liste(Enreg); Ajouter_element_a_la_liste(Enreg);
Liste_Nb_repertoires++; Liste_Nb_repertoires++;
} }
else if (S_ISREG(Infos_enreg.st_mode) //Il s'agit d'un fichier else if (S_ISREG(Infos_enreg.st_mode) && //Il s'agit d'un fichier
&& ((!isHidden(Enreg)) || !Config.Lire_les_fichiers_caches)) //Il n'est pas caché (Config.Lire_les_fichiers_caches || //Il n'est pas caché
!isHidden(Enreg)))
{ {
if (VerifieExtension(Enreg->d_name, Filtre)) if (VerifieExtension(Enreg->d_name, Filtre))
{ {
@ -280,10 +279,6 @@ void Lire_liste_des_fichiers(byte Format_demande)
} }
} }
// On cherche l'élément suivant
Enreg=readdir(Repertoire_Courant);
}
closedir(Repertoire_Courant); closedir(Repertoire_Courant);
Liste_Nb_elements=Liste_Nb_repertoires+Liste_Nb_fichiers; Liste_Nb_elements=Liste_Nb_repertoires+Liste_Nb_fichiers;
@ -357,11 +352,11 @@ void Trier_la_liste_des_fichiers(void)
if (Element_suivant_le_suivant!=NULL) if (Element_suivant_le_suivant!=NULL)
Element_suivant_le_suivant->Precedent=Element_courant; Element_suivant_le_suivant->Precedent=Element_courant;
// On fait bien attention modifier la tête de liste en cas de besoin // On fait bien attention à modifier la tête de liste en cas de besoin
if (Element_courant==Liste_du_fileselect) if (Element_courant==Liste_du_fileselect)
Liste_du_fileselect=Element_suivant; Liste_du_fileselect=Element_suivant;
// Ensuite, on se prépare étudier les éléments précédents: // Ensuite, on se prépare à étudier les éléments précédents:
Element_courant=Element_precedent; Element_courant=Element_precedent;
// Et on constate que la liste n'était pas encore génialement triée // Et on constate que la liste n'était pas encore génialement triée
@ -401,12 +396,12 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
// On vérifie s'il y a au moins 1 fichier dans la liste: // On vérifie s'il y a au moins 1 fichier dans la liste:
if (Liste_Nb_elements>0) if (Liste_Nb_elements>0)
{ {
// On commence par chercher pointer sur le premier fichier visible: // On commence par chercher à pointer sur le premier fichier visible:
Element_courant=Liste_du_fileselect; Element_courant=Liste_du_fileselect;
for (;Decalage_premier>0;Decalage_premier--) for (;Decalage_premier>0;Decalage_premier--)
Element_courant=Element_courant->Suivant; Element_courant=Element_courant->Suivant;
// Pour chacun des 10 éléments inscriptibles l'écran // Pour chacun des 10 éléments inscriptibles à l'écran
for (Indice=0;Indice<10;Indice++) for (Indice=0;Indice<10;Indice++)
{ {
// S'il est sélectionné: // S'il est sélectionné:
@ -434,7 +429,7 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select
// On affiche l'élément // On affiche l'élément
Print_dans_fenetre(9,90+FILENAMESPACE+(Indice<<3),Element_courant->NomAbrege,Couleur_texte,Couleur_fond); Print_dans_fenetre(9,90+FILENAMESPACE+(Indice<<3),Element_courant->NomAbrege,Couleur_texte,Couleur_fond);
// On passe la ligne suivante // On passe à la ligne suivante
Decalage_select--; Decalage_select--;
Element_courant=Element_courant->Suivant; Element_courant=Element_courant->Suivant;
if (!Element_courant) if (!Element_courant)
@ -452,14 +447,12 @@ void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select
// sélecteur et le premier fichier de la liste // sélecteur et le premier fichier de la liste
// //
// Decalage_select = Décalage entre le premier fichier visible dans le // Decalage_select = Décalage entre le premier fichier visible dans le
// sélecteur et le fichier récupérer // sélecteur et le fichier à récupérer
// //
// Libelle = Chaine de réception du libellé de l'élément // Libelle = Chaine de réception du libellé de l'élément
// //
{ {
struct Element_de_liste_de_fileselect * Element_courant; struct Element_de_liste_de_fileselect * Element_courant;
char * Curseur;
// On vérifie s'il y a au moins 1 fichier dans la liste: // On vérifie s'il y a au moins 1 fichier dans la liste:
if (Liste_Nb_elements>0) if (Liste_Nb_elements>0)
@ -578,7 +571,7 @@ void Select_Home(short * Decalage_premier,short * Decalage_select)
short Calculer_decalage_click_dans_fileselector(void) short Calculer_decalage_click_dans_fileselector(void)
/* /*
Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické. Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické.
Renvoie le décalage du dernier fichier si on a clické au del. Renvoie le décalage du dernier fichier si on a clické au delà.
Renvoie -1 si le sélecteur est vide. Renvoie -1 si le sélecteur est vide.
*/ */
{ {

View File

@ -111,9 +111,9 @@
; Show special files and ³ Afficher les fichiers et répertoires ; Show special files and ³ Afficher les fichiers et répertoires
; directories (values are 'yes' or ³ spéciaux (les valeurs sont 'yes' ou ; directories (values are 'yes' or ³ spéciaux (les valeurs sont 'yes' ou
; 'no'). ³ 'no'). ; 'no'). ³ 'no').
Show_hidden_files = yes ; (default 'no') Show_hidden_files = no ; (default 'no')
Show_hidden_directories = yes ; (default 'no') Show_hidden_directories = no ; (default 'no')
Show_system_directories = yes ; (default 'no') Show_system_directories = no ; (default 'no')
; Delay before displaying a preview ³ Délai avant d'afficher une preview ; Delay before displaying a preview ³ Délai avant d'afficher une preview
; in file-selectors (in 18.2th of ³ dans les sélecteurs de fichiers (en ; in file-selectors (in 18.2th of ³ dans les sélecteurs de fichiers (en