diff --git a/src/Makefile.dep b/src/Makefile.dep index 0059f24d..33532417 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -15,7 +15,7 @@ $(OBJDIR)/engine.o: engine.c const.h struct.h global.h graph.h misc.h special.h input.h engine.h pages.h layers.h factory.h loadsave.h io.h $(OBJDIR)/factory.o: factory.c brush.h struct.h const.h buttons.h engine.h errors.h \ filesel.h loadsave.h global.h graph.h io.h misc.h pages.h readline.h \ - sdlscreen.h windows.h palette.h input.h help.h + sdlscreen.h windows.h palette.h input.h help.h realpath.h $(OBJDIR)/fileformats.o: fileformats.c errors.h global.h struct.h const.h \ loadsave.h misc.h io.h windows.h pages.h $(OBJDIR)/filesel.o: filesel.c const.h struct.h global.h misc.h errors.h io.h \ @@ -82,7 +82,7 @@ $(OBJDIR)/pxwide.o: pxwide.c global.h struct.h const.h sdlscreen.h misc.h graph. $(OBJDIR)/pxwide2.o: pxwide2.c global.h struct.h const.h sdlscreen.h misc.h graph.h \ pxwide2.h $(OBJDIR)/readini.o: readini.c const.h errors.h global.h struct.h misc.h readini.h \ - setup.h + setup.h realpath.h io.h $(OBJDIR)/readline.o: readline.c const.h struct.h global.h misc.h errors.h \ sdlscreen.h readline.h windows.h input.h engine.h $(OBJDIR)/realpath.o: realpath.c diff --git a/src/factory.c b/src/factory.c index 00705672..27efa774 100644 --- a/src/factory.c +++ b/src/factory.c @@ -1308,7 +1308,7 @@ void Draw_script_information(T_Fileselector_item * script_item, const char *full // Blank the target area Window_rectangle(7, FILESEL_Y + 89, DESC_WIDTH*6+2, 4*8, MC_Black); - if (script_item && script_item->Full_name && script_item->Full_name[0]!='\0') + if (script_item && script_item->Type==0 && script_item->Full_name && script_item->Full_name[0]!='\0') { char full_name[MAX_PATH_CHARACTERS]; strcpy(full_name, full_directory); @@ -1698,28 +1698,11 @@ void Set_script_shortcut(T_Fileselector_item * script_item, const char *full_dir } } -void Button_Brush_Factory(void) +void Reload_scripts_list(void) { - static char selected_file[MAX_PATH_CHARACTERS]=""; - static char sub_directory[MAX_PATH_CHARACTERS]="!"; - - short clicked_button; - T_List_button* scriptlist; - T_Scroller_button* scriptscroll; - T_Special_button* scriptarea; - T_Fileselector_item *item; - int last_selected_item=-1; - - if (sub_directory[0]=='!') - { - // Default directory - Realpath(Data_directory, sub_directory); - Append_path(sub_directory, "scripts", NULL); - } - // Reinitialize the list Free_fileselector_list(&Scripts_selector); - if (sub_directory[0]=='\0') + if (Config.Scripts_directory[0]=='\0') { Read_list_of_drives(&Scripts_selector,NAME_WIDTH+1); } @@ -1727,11 +1710,25 @@ void Button_Brush_Factory(void) { Add_element_to_list(&Scripts_selector, PARENT_DIR, Format_filename(PARENT_DIR, NAME_WIDTH+1, 1), 1, ICON_NONE); // Add each found file to the list - For_each_directory_entry(sub_directory, Add_script); + For_each_directory_entry(Config.Scripts_directory, Add_script); } // Sort it - Sort_list_of_files(&Scripts_selector); + Sort_list_of_files(&Scripts_selector); // +} + +void Button_Brush_Factory(void) +{ + static char selected_file[MAX_PATH_CHARACTERS]=""; + + short clicked_button; + T_List_button* scriptlist; + T_Scroller_button* scriptscroll; + T_Special_button* scriptarea; + T_Fileselector_item *item; + int last_selected_item=-1; + + Reload_scripts_list(); Open_window(33+8*NAME_WIDTH, 180, "Brush Factory"); @@ -1760,7 +1757,7 @@ void Button_Brush_Factory(void) Window_redraw_list(scriptlist); Draw_script_information(Get_item_by_index(&Scripts_selector, - scriptlist->List_start + scriptlist->Cursor_position), sub_directory); + scriptlist->List_start + scriptlist->Cursor_position), Config.Scripts_directory); Update_window_area(0, 0, Window_width, Window_height); Display_cursor(); @@ -1776,7 +1773,7 @@ void Button_Brush_Factory(void) do { clicked_button = Window_clicked_button(); - if (Key==SDLK_BACKSPACE && sub_directory[0]!='\0') + if (Key==SDLK_BACKSPACE && Config.Scripts_directory[0]!='\0') { // Make it select first entry (parent directory) scriptlist->List_start=0; @@ -1802,13 +1799,13 @@ void Button_Brush_Factory(void) last_selected_item = scriptlist->List_start + scriptlist->Cursor_position; Hide_cursor(); Draw_script_information(Get_item_by_index(&Scripts_selector, - scriptlist->List_start + scriptlist->Cursor_position), sub_directory); + scriptlist->List_start + scriptlist->Cursor_position), Config.Scripts_directory); Display_cursor(); break; case 6: Set_script_shortcut(Get_item_by_index(&Scripts_selector, - scriptlist->List_start + scriptlist->Cursor_position), sub_directory); + scriptlist->List_start + scriptlist->Cursor_position), Config.Scripts_directory); break; default: @@ -1844,31 +1841,17 @@ void Button_Brush_Factory(void) { // Selecting one drive root strcpy(selected_file, PARENT_DIR); - strcat(sub_directory, item->Full_name); + strcat(Config.Scripts_directory, item->Full_name); } else { // Going down one or up by one directory - Append_path(sub_directory, item->Full_name, selected_file); + Append_path(Config.Scripts_directory, item->Full_name, selected_file); } // No break: going back up to beginning of loop - // Reinitialize the list - Free_fileselector_list(&Scripts_selector); - if (sub_directory[0]=='\0') - { - Read_list_of_drives(&Scripts_selector,NAME_WIDTH+1); - } - else - { - Add_element_to_list(&Scripts_selector, PARENT_DIR, Format_filename(PARENT_DIR, NAME_WIDTH+1, 1), 1, ICON_NONE); - // Add each found file to the list - For_each_directory_entry(sub_directory, Add_script); - } - // Sort it - Sort_list_of_files(&Scripts_selector); - // + Reload_scripts_list(); scriptlist->Scroller->Nb_elements=Scripts_selector.Nb_elements; Compute_slider_cursor_length(scriptlist->Scroller); @@ -1882,7 +1865,7 @@ void Button_Brush_Factory(void) if (clicked_button == 5) // Run the script { - Run_script(sub_directory, selected_file); + Run_script(Config.Scripts_directory, selected_file); } else { diff --git a/src/io.c b/src/io.c index c28155ed..171cb853 100644 --- a/src/io.c +++ b/src/io.c @@ -219,7 +219,11 @@ void Append_path(char *path, const char *filename, char *reverse_path) // Remove trailing slash len=strlen(path); - if (len && !strcmp(path+len-1,PATH_SEPARATOR)) + if (len && (!strcmp(path+len-1,PATH_SEPARATOR) + #ifdef __WIN32__ + || path[len-1]=='/' + #endif + )) path[len-1]='\0'; slash_pos=Find_last_slash(path); @@ -249,7 +253,11 @@ void Append_path(char *path, const char *filename, char *reverse_path) long len; // Add trailing slash if needed len=strlen(path); - if (len && strcmp(path+len-1,PATH_SEPARATOR)) + if (len && (strcmp(path+len-1,PATH_SEPARATOR) + #ifdef __WIN32__ + && path[len-1]!='/' + #endif + )) { strcpy(path+len, PATH_SEPARATOR); len+=strlen(PATH_SEPARATOR); diff --git a/src/readini.c b/src/readini.c index 15473878..225eabd6 100644 --- a/src/readini.c +++ b/src/readini.c @@ -34,6 +34,8 @@ #include "misc.h" #include "readini.h" #include "setup.h" +#include "realpath.h" +#include "io.h" void Load_INI_clear_string(char * str, byte keep_comments) { @@ -933,7 +935,18 @@ int Load_INI(T_Config * conf) } } - + // Optional, Location of last directory used for Lua scripts browsing (>=2.3) + conf->Scripts_directory[0]='\0'; + if (!Load_INI_get_string (file,buffer,"Scripts_directory",value_label, 1)) + { + strcpy(conf->Scripts_directory,value_label); + } + if (conf->Scripts_directory[0]=='\0') + { + // Default when empty: + Realpath(Data_directory, conf->Scripts_directory); + Append_path(conf->Scripts_directory, "scripts", NULL); + } // Insert new values here diff --git a/src/saveini.c b/src/saveini.c index b512b7ac..fab3cc12 100644 --- a/src/saveini.c +++ b/src/saveini.c @@ -419,7 +419,9 @@ int Save_INI(T_Config * conf) strcpy(temp_filename,Config_directory); strcat(temp_filename,INISAVE_FILENAME); - // On renome l'ancienne version du fichier INI vers un fichier temporaire: + // Delete gfx2.$$$ + remove(temp_filename); + // Rename current config file as gfx2.$$$ if (rename(filename,temp_filename)!=0) { goto Erreur_ERREUR_SAUVEGARDE_INI; @@ -697,6 +699,9 @@ int Save_INI(T_Config * conf) if ((return_code=Save_INI_set_values (old_file,new_file,buffer,"Swap_buttons",1,values,0))) goto Erreur_Retour; + if ((return_code=Save_INI_set_strings (old_file,new_file,buffer,"Scripts_directory",conf->Scripts_directory))) + goto Erreur_Retour; + // Insert new values here Save_INI_flush(old_file,new_file,buffer); diff --git a/src/struct.h b/src/struct.h index d4f06b82..f61f820e 100644 --- a/src/struct.h +++ b/src/struct.h @@ -357,7 +357,7 @@ typedef struct byte Screen_size_in_GIF; ///< Boolean, true to store current resolution in GIF files. byte Auto_nb_used; ///< Boolean, true to count colors in Palette screen. byte Default_resolution; ///< Default video mode to use on startup. Index in ::Video_mode. - char *Bookmark_directory[NB_BOOKMARKS];///< Bookmarked directories in fileselectors: This is the full dierctory name. + char *Bookmark_directory[NB_BOOKMARKS];///< Bookmarked directories in fileselectors: This is the full directory name. char Bookmark_label[NB_BOOKMARKS][8+1];///< Bookmarked directories in fileselectors: This is the displayed name. int Window_pos_x; ///< Last window x position (9999 if unsupportd/irrelevant for the platform) int Window_pos_y; ///< Last window y position (9999 if unsupportd/irrelevant for the platform) @@ -368,6 +368,7 @@ typedef struct byte Sync_views; ///< Boolean, true when the Main and Spare should share their viewport settings. byte Stylus_mode; ///< Boolean, true to tweak some tools (eg:Curve) for single-button stylus. word Swap_buttons; ///< Sets which key swaps mouse buttons : 0=none, or MOD_CTRL, or MOD_ALT. + char Scripts_directory[MAX_PATH_CHARACTERS];///< Full pathname of directory for Lua scripts } T_Config; // Structures utilisées pour les descriptions de pages et de liste de pages.