From ca8be4e39954cb92d993a6502dfa6e33ef798bc2 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 25 Sep 2008 16:37:50 +0000 Subject: [PATCH] Save/Load: Fixed backspace, limit 255 characters, various fixes for long filenames, (linux) drive '~' uses $HOME environment variable. Fixed some more struct packing issues (ex: GIF saving) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@163 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 4 ++-- graph.c | 58 ++++++++++++++++++++++++++++++++++++++---------------- graph.h | 5 +++-- init.c | 13 ++++++++++++ loadsave.c | 20 +++++++++---------- readline.c | 27 ++++++++++++++----------- readline.h | 2 +- 7 files changed, 86 insertions(+), 43 deletions(-) diff --git a/boutons.c b/boutons.c index 843c61b4..93bbf365 100644 --- a/boutons.c +++ b/boutons.c @@ -2133,7 +2133,7 @@ void Print_Nom_fichier_dans_selecteur(void) // { Block(Fenetre_Pos_X+(Menu_Facteur_X*(13+9*8)),Fenetre_Pos_Y+(Menu_Facteur_Y*90),Menu_Facteur_X*(27*8),Menu_Facteur_Y<<3,CM_Clair); - Print_dans_fenetre(13+9*8,90,Principal_Nom_fichier,CM_Noir,CM_Clair); + Print_dans_fenetre_limite(13+9*8,90,Principal_Nom_fichier,27,CM_Noir,CM_Clair); } @@ -2593,7 +2593,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) break; case 8 : // Saisie du nom de fichier Effacer_curseur(); - if (Readline(13+9*8,90,Principal_Nom_fichier,50,2)) + if (Readline(13+9*8,90,Principal_Nom_fichier,27,2)) { // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. diff --git a/graph.c b/graph.c index f38620b5..bbfa1daa 100644 --- a/graph.c +++ b/graph.c @@ -542,7 +542,7 @@ void Liste2tables(word * Liste,short Pas,byte Mode,byte * Table_inc,byte * Table } -// Transformer un nombre (entier naturel) en chaŒne +// Transformer un nombre (entier naturel) en chaîne void Num2str(dword Nombre,char * Chaine,byte Taille) { int Indice; @@ -558,7 +558,7 @@ void Num2str(dword Nombre,char * Chaine,byte Taille) Chaine[Taille]='\0'; } -// Transformer une chaŒne en un entier naturel (renvoie -1 si ch. invalide) +// Transformer une chaîne en un entier naturel (renvoie -1 si ch. invalide) int Str2num(char * Chaine) { int Valeur=0; @@ -1032,14 +1032,14 @@ void Afficher_pixel(word X,word Y,byte Couleur) // -- Interface avec le menu et les fenêtres --------------------------------- - // Affichage d'un pixel dans le menu (le menu doŒt être visible) + // Affichage d'un pixel dans le menu (le menu doît être visible) void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur) { Block_Fast(X*Menu_Facteur_X,(Y*Menu_Facteur_Y)+Menu_Ordonnee,Menu_Facteur_X,Menu_Facteur_Y,Couleur); } - // Affichage d'un pixel dans la fenêtre (la fenêtre doŒt être visible) + // Affichage d'un pixel dans la fenêtre (la fenêtre doît être visible) void Pixel_dans_fenetre(word X,word Y,byte Couleur) { @@ -1354,7 +1354,7 @@ unsigned char Caractere_OEM[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // -- Affichage de texte ----------------------------------------------------- - // -- Afficher une chaŒne n'importe o— à l'écran -- + // -- Afficher une chaîne n'importe où à l'écran -- void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond) { @@ -1388,10 +1388,9 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur // -- Afficher un caractère dans une fenêtre -- -void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond) +void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond) { short X,Y; - Pos_X=(Pos_X*Menu_Facteur_X)+Fenetre_Pos_X; Pos_Y=(Pos_Y*Menu_Facteur_Y)+Fenetre_Pos_Y; @@ -1404,7 +1403,7 @@ void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur // -- Afficher un caractère sans fond dans une fenêtre -- -void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur) +void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur) { short X,Y; @@ -1420,7 +1419,23 @@ void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere, } } - // -- Afficher une chaŒne dans une fenêtre -- + // -- Afficher une chaîne dans une fenêtre, avec taille maxi -- + +void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond) +{ + char Chaine_affichee[256]; + strncpy(Chaine_affichee, Chaine, Taille); + Chaine_affichee[255]='\0'; + + if (strlen(Chaine_affichee) > Taille) + { + Chaine_affichee[Taille-1]=CARACTERE_TRIANGLE_DROIT; + Chaine_affichee[Taille]='\0'; + } + Print_dans_fenetre(X, Y, Chaine_affichee, Couleur_texte, Couleur_fond); +} + + // -- Afficher une chaîne dans une fenêtre -- void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond) { @@ -1429,7 +1444,7 @@ void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Co Chaine,Couleur_texte,Couleur_fond); } - // -- Afficher une chaŒne dans le menu -- + // -- Afficher une chaîne dans le menu -- void Print_dans_menu(char * Chaine, short Position) { @@ -1473,15 +1488,24 @@ void Print_coordonnees(void) void Print_nom_fichier(void) { short Debut_X; - + if (Menu_visible) { + // Si le nom de fichier fait plus de 12 caractères, on n'affiche que les 12 derniers + char * Nom_affiche = Principal_Nom_fichier; + int Taille_nom =strlen(Principal_Nom_fichier); + if (Taille_nom>12) + { + Nom_affiche=Principal_Nom_fichier + Taille_nom - 12; + Taille_nom = 12; + } + Block((LARGEUR_MENU+2+((Menu_Taille_couleur-12)<<3))*Menu_Facteur_X, Menu_Ordonnee_Texte,Menu_Facteur_X*96,Menu_Facteur_Y<<3,CM_Clair); - Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-strlen(Principal_Nom_fichier))<<3); + Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-Taille_nom)<<3); - Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Principal_Nom_fichier,CM_Noir,CM_Clair); + Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Nom_affiche,CM_Noir,CM_Clair); } } @@ -4727,12 +4751,12 @@ void Degrade_de_trames_simples(long Indice,short Pos_X,short Pos_Y) // dans cette procédure par "Position_dans_degrade", on calcule la position // de l'indice dans le schéma suivant: // - // Ú Les indices qui traŒnent de ce c“té du segment se voient subir + // Ú Les indices qui traînent de ce c“té du segment se voient subir // ³ une incrémentation conditionnelle à leur position dans l'écran. // v // ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú // ^ - // ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une + // ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une // décrémentation conditionnelle à leur position dans l'écran. // On fait d'abord un premier calcul partiel @@ -4799,12 +4823,12 @@ void Degrade_de_trames_etendues(long Indice,short Pos_X,short Pos_Y) // dans cette procédure par "Position_dans_degrade", on calcule la position // de l'indice dans le schéma suivant: // - // Ú Les indices qui traŒnent de ce c“té du segment se voient subir + // Ú Les indices qui traînent de ce c“té du segment se voient subir // ³ une incrémentation conditionnelle à leur position dans l'écran. // v // ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú // ^ - // ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une + // ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une // décrémentation conditionnelle à leur position dans l'écran. // On fait d'abord un premier calcul partiel diff --git a/graph.h b/graph.h index 2e8cf562..d6302284 100644 --- a/graph.h +++ b/graph.h @@ -38,8 +38,9 @@ void Recadrer_palette(void); void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); -void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond); -void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur); +void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond); +void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond); +void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur); void Print_dans_menu(char * Chaine, short Position); void Print_coordonnees(void); void Print_nom_fichier(void); diff --git a/init.c b/init.c index 355084bd..de1253d1 100644 --- a/init.c +++ b/init.c @@ -140,6 +140,19 @@ void Rechercher_drives(void) // Renvoie 0 si ok, -1 si problème. int ActiverLecteur(int NumeroLecteur) { + // Cas particulier du lecteur ~ + if (Drive[NumeroLecteur].Lettre == '~') + { + char * Home = getenv("HOME"); + if (! Home) + return -1; + #ifdef __linux__ + return chdir(Home); + #else + return ! SetCurrentDirectory(Home); + #endif + } + #ifdef __linux__ char NomLecteur[]=" "; NomLecteur[0]=Drive[NumeroLecteur].Lettre; diff --git a/loadsave.c b/loadsave.c index d6bfdf13..04e81066 100644 --- a/loadsave.c +++ b/loadsave.c @@ -758,7 +758,7 @@ typedef struct word Hauteur; byte Filler2[118]; T_Palette Palette; -} T_Header_IMG; +} __attribute__((__packed__)) T_Header_IMG; // -- Tester si un fichier est au format IMG -------------------------------- void Test_IMG(void) @@ -931,7 +931,7 @@ typedef struct T_Palette Palette; // Palette RVB 256*3 word Jump; // Taille du saut entre le header et l'image: // On va s'en servir pour rajouter un commentaire -} T_Header_PKM; +} __attribute__((__packed__)) T_Header_PKM; // -- Tester si un fichier est au format PKM -------------------------------- void Test_PKM(void) @@ -1357,7 +1357,7 @@ typedef struct byte Yaspect; // Inutile short Xscreen; short Yscreen; -} T_Header_LBM; +} __attribute__((__packed__)) T_Header_LBM; // -- Tester si un fichier est au format LBM -------------------------------- @@ -2118,7 +2118,7 @@ typedef struct uint32_t YPM; uint32_t Nb_Clr; uint32_t Clr_Imprt; -} T_BMP_Header; +} __attribute__((__packed__)) T_BMP_Header; // -- Tester si un fichier est au format BMP -------------------------------- void Test_BMP(void) @@ -2545,7 +2545,7 @@ typedef struct byte Resol; // Informations sur la résolution (et autres) byte Backcol; // Couleur de fond byte Aspect; // Informations sur l'aspect ratio (et autres) -} T_LSDB; // Logical Screen Descriptor Block +} __attribute__((__packed__)) T_LSDB; // Logical Screen Descriptor Block typedef struct { @@ -2555,7 +2555,7 @@ typedef struct word Hauteur_image; // Hauteur de l'image byte Indicateur; // Informations diverses sur l'image byte Nb_bits_pixel; // Nb de bits par pixel -} T_IDB; // Image Descriptor Block +} __attribute__((__packed__)) T_IDB; // Image Descriptor Block // -- Tester si un fichier est au format GIF -------------------------------- @@ -3855,7 +3855,7 @@ typedef struct { word Width; // Largeur de l'image word Height; // Hauteur de l'image -} T_CEL_Header1; +} __attribute__((__packed__)) T_CEL_Header1; typedef struct { @@ -3868,7 +3868,7 @@ typedef struct word Decalage_X; // Decalage en X de l'image word Decalage_Y; // Decalage en Y de l'image byte Filler2[16]; // ??? -} T_CEL_Header2; +} __attribute__((__packed__)) T_CEL_Header2; // -- Tester si un fichier est au format CEL -------------------------------- @@ -4163,7 +4163,7 @@ typedef struct byte Octet2; } Couleur[16]; } Palette[10]; -} T_KCF_Header; +} __attribute__((__packed__)) T_KCF_Header; // -- Tester si un fichier est au format KCF -------------------------------- @@ -4419,7 +4419,7 @@ typedef struct word Hauteur; byte Filler2; byte Plans; -} T_SCx_Header; +} __attribute__((__packed__)) T_SCx_Header; // -- Tester si un fichier est au format SCx -------------------------------- void Test_SCx(void) diff --git a/readline.c b/readline.c index 98ab0e51..b06d7c5b 100644 --- a/readline.c +++ b/readline.c @@ -79,7 +79,7 @@ void Rafficher_toute_la_chaine(word Pos_X,word Pos_Y,char * Chaine,byte Position //**************************************************************************** //* Enhanced super scanf deluxe pro plus giga mieux :-) * //**************************************************************************** -byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie) +byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie) // Paramètres: // Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre // Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale) @@ -94,13 +94,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai byte Taille; word Touche_lue=0; byte Touche_autorisee; - byte Taille_affichee; + byte Taille_maxi; // Grosse astuce pour les noms de fichiers: La taille affichée est différente // de la taille maximum gérée. if (Type_saisie == 2) - Taille_affichee = 27; + Taille_maxi = 255; else - Taille_affichee = Taille_maxi; + Taille_maxi = Taille_affichee; byte Offset=0; // Indice du premier caractère affiché @@ -118,6 +118,8 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai Taille=strlen(Chaine); Position=(TailleTaille_affichee) + Offset=Position-Taille_affichee+1; // Formatage d'une partie de la chaine (si trop longue pour tenir) strncpy(Chaine_affichee, Chaine + Offset, Taille_affichee); Chaine_affichee[Taille_affichee]='\0'; @@ -191,10 +193,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai goto affichage; } break; - case SDLK_BACKSPACE : + case SDLK_BACKSPACE : // Backspace : combinaison de gauche + suppr if (Position) - { - Supprimer_caractere(Chaine,--Position); + { + Position--; + if (Offset > 0 && (Position == 0 || Position < (Offset + 1))) + Offset--; + Supprimer_caractere(Chaine,Position); Taille--; // Effacement de la chaîne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), @@ -242,8 +247,6 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai if (Taille Taille_affichee + Offset - 2 && !(Position Taille_affichee + Offset - 2))) if (Chaine_affichee[Position-Offset]==CARACTERE_TRIANGLE_DROIT || Position-Offset>=Taille_affichee) Offset++; } @@ -270,7 +273,7 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai // Effacement de la chaîne Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), - Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); + Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND); // On raffiche la chaine correctement if (Type_saisie==1) { @@ -282,7 +285,9 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai Print_dans_fenetre(Pos_X+((Taille_maxi-Taille)<<3),Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND); } else - Print_dans_fenetre(Pos_X,Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND); + { + Print_dans_fenetre_limite(Pos_X,Pos_Y,Chaine,Taille_affichee,COULEUR_TEXTE,COULEUR_FOND); + } return (Touche_lue==SDLK_RETURN); } diff --git a/readline.h b/readline.h index 16f1e515..e20d2ee0 100644 --- a/readline.h +++ b/readline.h @@ -1,5 +1,5 @@ -byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie); +byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie); // Paramètres: // Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre // Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)