From 08e3c6bebfb6c48dafd58eb84671f71bb36642f1 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Sat, 20 Jan 2018 23:59:41 +0100 Subject: [PATCH] Fix issue 46 : part 2 in Error(0) the palette was not properly restored as it was always restored to the Main_palette. Now we really restore the right palette ! Also clarified/simplified the change directory code in case of error. http://pulkomandy.tk/projects/GrafX2/ticket/46 --- src/filesel.c | 48 +++++++++++++++++++++++++----------------------- src/main.c | 6 ++++-- src/misc.c | 15 ++++++++++++--- src/misc.h | 1 + 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/filesel.c b/src/filesel.c index b9f7a194..98c68b47 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -2061,47 +2061,49 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context Hide_cursor(); has_clicked_ok=0; - // On mémorise le répertoire dans lequel on était - if (strcmp(Selector_filename,PARENT_DIR)) - { - strcpy(previous_directory,PARENT_DIR); - } - else - { - Extract_filename(previous_directory, Selector->Directory); - } - - // On doit rentrer dans le répertoire: + // We must enter the directory if (!chdir(Selector_filename)) { - #if defined (__MINT__) + #if defined (__MINT__) static char path[1024]={0}; char currentDrive='A'; + #endif + + // save the previous current directory + if (strcmp(Selector_filename,PARENT_DIR) != 0) + { + strcpy(previous_directory,PARENT_DIR); + } + else + { + Extract_filename(previous_directory, Selector->Directory); + } + + #if defined (__MINT__) currentDrive=currentDrive+Dgetdrv(); Dgetpath(path,0); - sprintf(Selector->Directory,"%c:\%s",currentDrive,path); + sprintf(Selector->Directory,"%c:\%s",currentDrive,path); #else getcwd(Selector->Directory,MAX_PATH_CHARACTERS); #endif - // On lit le nouveau répertoire + // read the new directory Read_list_of_files(&Filelist, Selector->Format_filter); Sort_list_of_files(&Filelist); - // On place la barre de sélection sur le répertoire d'où l'on vient + // Set the fileselector bar on the directory we're coming from Highlight_file(Find_file_in_fileselector(&Filelist, previous_directory)); + // display the 1st visible files + Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller); + Display_cursor(); + New_preview_is_needed=1; + + // New directory, so we need to reset the quicksearch + Reset_quicksearch(); } else { Display_cursor(); Error(0); - Hide_cursor(); } - // Affichage des premiers fichiers visibles: - Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller); - Display_cursor(); - New_preview_is_needed=1; - - // On est dans un nouveau répertoire, donc on remet le quicksearch à 0 - Reset_quicksearch(); } else // Sinon on essaye de charger ou sauver le fichier { diff --git a/src/main.c b/src/main.c index e2a659f0..0f167221 100644 --- a/src/main.c +++ b/src/main.c @@ -137,6 +137,7 @@ void Warning_function(const char *message, const char *filename, int line_number void Error_function(int error_code, const char *filename, int line_number, const char *function_name) { T_Palette temp_palette; + T_Palette backup_palette; int index; printf("Error number %d occured in file %s, line %d, function %s.\n", error_code, filename,line_number,function_name); @@ -144,12 +145,13 @@ void Error_function(int error_code, const char *filename, int line_number, const { // L'erreur 0 n'est pas une vraie erreur, elle fait seulement un flash rouge de l'écran pour dire qu'il y a un problème. // Toutes les autres erreurs déclenchent toujours une sortie en catastrophe du programme ! - memcpy(temp_palette,Main_palette,sizeof(T_Palette)); + memcpy(backup_palette, Get_current_palette(), sizeof(T_Palette)); + memcpy(temp_palette, backup_palette, sizeof(T_Palette)); for (index=0;index<=255;index++) temp_palette[index].R=255; Set_palette(temp_palette); Delay_with_active_mouse(50); // Half a second of red flash - Set_palette(Main_palette); + Set_palette(backup_palette); } else { diff --git a/src/misc.c b/src/misc.c index b36396c0..09f87562 100644 --- a/src/misc.c +++ b/src/misc.c @@ -151,11 +151,19 @@ word Count_used_colors_area(dword* usage, word start_x, word start_y, return nb_colors; } +static T_Palette Current_palette = {0}; + +const T_Components * Get_current_palette(void) +{ + return Current_palette; +} void Set_palette(T_Palette palette) { register int i; SDL_Color PaletteSDL[256]; + + memcpy(Current_palette, palette, sizeof(T_Palette)); for(i=0;i<256;i++) { PaletteSDL[i].r=(palette[i].R=Round_palette_component(palette[i].R)); @@ -168,9 +176,10 @@ void Set_palette(T_Palette palette) void Set_color(byte color, byte red, byte green, byte blue) { SDL_Color comp; - comp.r=red; - comp.g=green; - comp.b=blue; + + Current_palette[color].R = comp.r = red; + Current_palette[color].G = comp.g = green; + Current_palette[color].B = comp.b = blue; SDL_SetPalette(Screen_SDL, SDL_PHYSPAL | SDL_LOGPAL, &comp, color, 1); } diff --git a/src/misc.h b/src/misc.h index 84ba7aab..af745a0a 100644 --- a/src/misc.h +++ b/src/misc.h @@ -37,6 +37,7 @@ void Remap_general_lowlevel(byte * conversion_table,byte * in_buffer, byte *out_ void Scroll_picture(byte * main_src, byte * main_dest, short x_offset,short y_offset); void Wait_end_of_click(void); void Set_color(byte color, byte red, byte green, byte blue); +const T_Components * Get_current_palette(void); void Set_palette(T_Palette palette); void Palette_256_to_64(T_Palette palette); void Palette_64_to_256(T_Palette palette);