diff --git a/src/filesel.c b/src/filesel.c index 6134004d..c69d8aec 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -147,10 +147,6 @@ static T_Fileselector Filelist; /// Selector settings to use, for all functions called by Load_or_save static T_Selector_settings * Selector; -/// Filename (without directory) of the highlighted file -static char Selector_filename[256]; -static word Selector_filename_unicode[256]; - // Conventions: // // * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir @@ -1049,33 +1045,32 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o /** * Get the label of a list item. + * + * selector->filename and selector->filename_unicode are updated + * * @param list the file list - * @param offset_first offset between the 1st visible file and the 1st file in list. - * @param selector_offset offset between the 1st visible file and the wanted label. - * @param label pointer to a buffer to receive the label (ANSI) - * @param unicode_label pointer to a buffer to receive the label (Unicode) + * @param selector the current File selector * @param type NULL or a pointer to receive the type : 0 = file, 1 = directory, 2 = drive. */ -static void Get_selected_item(T_Fileselector *list, short offset_first,short selector_offset,char * label,word * unicode_label, enum FSOBJECT_TYPE *type) +static void Get_selected_item(T_Fileselector *list, T_Selector_settings * selector, enum FSOBJECT_TYPE *type) { T_Fileselector_item * current_item; // On vérifie s'il y a au moins 1 fichier dans la liste: - if (list->Nb_elements>0) + if (list->Nb_elements > 0) { // On commence par chercher à pointer sur le premier fichier visible: // Ensuite, on saute autant d'éléments que le décalage demandé: - current_item = Get_item_by_index(list, offset_first + selector_offset); + current_item = Get_item_by_index(list, selector->Position + selector->Offset); // On recopie la chaîne - strcpy(label, current_item->Full_name); - if (unicode_label != NULL) - { - if (current_item->Unicode_full_name) - Unicode_strlcpy(unicode_label, current_item->Unicode_full_name, 256); - else - Unicode_char_strlcpy(unicode_label, current_item->Full_name, 256); - } + free(selector->filename); + selector->filename = strdup(current_item->Full_name); + free(selector->filename_unicode); + if (current_item->Unicode_full_name) + selector->filename_unicode = Unicode_strdup(current_item->Unicode_full_name); + else + selector->filename_unicode = NULL; if (type != NULL) *type=current_item->Type; @@ -1344,11 +1339,15 @@ static void Print_current_directory(void) void Print_filename_in_fileselector(void) { char filename[32]; - strncpy(filename, Selector_filename, sizeof(filename)); + if (Selector->filename != NULL) + strncpy(filename, Selector->filename, sizeof(filename)); + else + filename[0] = '\0'; #ifdef ENABLE_FILENAMES_ICONV + if (Selector->filename != NULL) { - char * input = (char *)Selector_filename; - size_t inbytesleft = strlen(Selector_filename); + char * input = (char *)Selector->filename; + size_t inbytesleft = strlen(Selector->filename); char * output = filename; size_t outbytesleft = sizeof(filename)-1; if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0) @@ -1356,10 +1355,10 @@ void Print_filename_in_fileselector(void) } #endif /* ENABLE_FILENAMES_ICONV */ Window_rectangle(82,48,27*8,8,MC_Light); - if (Selector_filename_unicode[0] != 0) + if (Selector->filename_unicode != NULL) { word filename_unicode[32]; - Unicode_strlcpy(filename_unicode, Selector_filename_unicode, 28); // 28 including the terminating 0 + Unicode_strlcpy(filename_unicode, Selector->filename_unicode, 28); // 28 including the terminating 0 Print_in_window_unicode(82,48,filename_unicode,MC_Black,MC_Light); } else @@ -1392,7 +1391,7 @@ static void Prepare_and_display_filelist(short Position, short offset, T_Scrolle if (setfilename) { // On récupère le nom du schmilblick à "accéder" - Get_selected_item(&Filelist, Position,offset,Selector_filename,Selector_filename_unicode,&Selected_type); + Get_selected_item(&Filelist, Selector, &Selected_type); } // On affiche le nouveau nom de fichier Print_filename_in_fileselector(); @@ -1436,9 +1435,7 @@ static void Reload_list_of_files(byte filter, T_Scroller_button * button) void Scroll_fileselector(T_Scroller_button * file_scroller) { - char old_filename[256]; - - strcpy(old_filename,Selector_filename); + char * old_filename = strdup(Selector->filename); // On regarde si la liste a bougé if (file_scroller->Position!=Selector->Position) @@ -1448,9 +1445,10 @@ void Scroll_fileselector(T_Scroller_button * file_scroller) Window_draw_slider(file_scroller); } // On récupére le nom du schmilblick à "accéder" - Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); - if (strcmp(old_filename,Selector_filename)) + Get_selected_item(&Filelist, Selector, &Selected_type); + if (strcmp(old_filename, Selector->filename)) New_preview_is_needed=1; + free(old_filename); // On affiche le nouveau nom de fichier Print_filename_in_fileselector(); @@ -1661,8 +1659,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context byte has_clicked_ok=0;// Indique si on a clické sur Load ou Save ou sur //un bouton enclenchant Load ou Save juste après. byte initial_back_color; // preview destroys it (how nice) - char save_filename[256]; - word save_filename_unicode[256]; + char *save_filename = NULL; char initial_comment[COMMENT_SIZE+1]; short window_shortcut; const char * directory_to_change_to = NULL; @@ -1809,11 +1806,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // On initialise le nom de fichier à celui en cours et non pas celui sous // la barre de sélection - strcpy(Selector_filename, context->File_name); - if (context->File_name_unicode != NULL) - Unicode_strlcpy(Selector_filename_unicode, context->File_name_unicode, 256); - else - Selector_filename_unicode[0] = 0; + free(Selector->filename); + Selector->filename = strdup(context->File_name); + free(Selector->filename_unicode); + Selector->filename_unicode = Unicode_strdup(context->File_name_unicode); // On affiche le nouveau nom de fichier Print_filename_in_fileselector(); } @@ -1837,9 +1833,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context if (load_from_clipboard) Selected_type = FSOBJECT_FILE; else if(load) // Determine the type - Selected_type = (File_exists(Selector_filename) && !Directory_exists(Selector_filename)) ? FSOBJECT_FILE : FSOBJECT_DIR; + Selected_type = (File_exists(Selector->filename) && !Directory_exists(Selector->filename)) ? FSOBJECT_FILE : FSOBJECT_DIR; else - Selected_type = Directory_exists(Selector_filename) ? FSOBJECT_DIR : FSOBJECT_FILE; + Selected_type = Directory_exists(Selector->filename) ? FSOBJECT_DIR : FSOBJECT_FILE; has_clicked_ok=1; break; @@ -1847,7 +1843,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context break; case 3 : // Delete - if (Filelist.Nb_elements && (*Selector_filename!='.') && Selected_type != FSOBJECT_DRIVE) + if (Filelist.Nb_elements && (Selector->filename[0] != '.') && Selected_type != FSOBJECT_DRIVE) { char * message; Hide_cursor(); @@ -1865,10 +1861,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // Si c'est un fichier if (Selector->Position+Selector->Offset>=Filelist.Nb_directories) // On efface le fichier (si on peut) - temp=(!Remove_path(Selector_filename)); + temp=(!Remove_path(Selector->filename)); else // Si c'est un repertoire // On efface le repertoire (si on peut) - temp=(!Remove_directory(Selector_filename)); + temp=(!Remove_directory(Selector->filename)); if (temp) // temp indique si l'effacement s'est bien passé { @@ -1915,7 +1911,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context Selector->Offset=temp; // get item name and details - Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); + Get_selected_item(&Filelist, Selector, &Selected_type); // display the new filename Print_filename_in_fileselector(); // and update list @@ -1936,7 +1932,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context if (Selector->Position+Selector->Offset < Filelist.Nb_directories) { // clicked on a directory // retrieve again the item name - Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); + Get_selected_item(&Filelist, Selector, &Selected_type); } has_clicked_ok=1; @@ -1952,7 +1948,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context Hide_cursor(); Selector->Position=Window_attribute2; // On récupére le nom du schmilblick à "accéder" - Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); + Get_selected_item(&Filelist, Selector, &Selected_type); load_from_clipboard = 0; // On affiche le nouveau nom de fichier Print_filename_in_fileselector(); @@ -1969,7 +1965,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context { int pos_last_dot; char* savename = NULL; - word Selector_filename_unicode_save[256]; + word* Selector_filename_unicode_save = NULL; GFX2_Log(GFX2_DEBUG, "fileselector format changed from %d to %d\n", (int)Selector->Format_filter, (int)Window_attribute2); Selector->Format_filter = Window_attribute2; @@ -1979,22 +1975,22 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context { // In "save" box, if current name is a (possible) filename // with extension, set it to new format's extension - pos_last_dot = Position_last_dot(Selector_filename); + pos_last_dot = Position_last_dot(Selector->filename); if (Get_fileformat(Selector->Format_filter)->Default_extension[0] != '\0' && pos_last_dot!=-1 && - Selector_filename[pos_last_dot+1]!='\0') + Selector->filename[pos_last_dot+1]!='\0') { - GFX2_Log(GFX2_DEBUG, "extension %s => %s\n", Selector_filename + pos_last_dot + 1, Get_fileformat(Selector->Format_filter)->Default_extension); - strcpy(Selector_filename + pos_last_dot + 1, + GFX2_Log(GFX2_DEBUG, "extension %s => %s\n", Selector->filename + pos_last_dot + 1, Get_fileformat(Selector->Format_filter)->Default_extension); + strcpy(Selector->filename + pos_last_dot + 1, Get_fileformat(Selector->Format_filter)->Default_extension); - pos_last_dot = Position_last_dot_unicode(Selector_filename_unicode); + pos_last_dot = Position_last_dot_unicode(Selector->filename_unicode); if (pos_last_dot != -1) - Unicode_char_strlcpy(Selector_filename_unicode + pos_last_dot + 1, + Unicode_char_strlcpy(Selector->filename_unicode + pos_last_dot + 1, Get_fileformat(Selector->Format_filter)->Default_extension, 256 - pos_last_dot - 1); } } - savename = (char *)strdup(Selector_filename); - memcpy(Selector_filename_unicode_save, Selector_filename_unicode, sizeof(Selector_filename_unicode_save)); + savename = strdup(Selector->filename); + Selector_filename_unicode_save = Unicode_strdup(Selector->filename_unicode); // By default, position list at the beginning Selector->Position = 0; Selector->Offset = 0; @@ -2003,7 +1999,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context Reload_list_of_files(Selector->Format_filter, file_scroller); New_preview_is_needed = 1; Reset_quicksearch(); - if (savename != NULL) + if (savename != NULL && savename[0] != '\0') { // attempt to find the file name in new list short pos=Find_file_in_fileselector(&Filelist, savename); @@ -2016,11 +2012,16 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // extension, set it as the proposed file name. if (pos >= 0 || !load) { - strcpy(Selector_filename, savename); - memcpy(Selector_filename_unicode, Selector_filename_unicode_save, sizeof(Selector_filename_unicode_save)); + free(Selector->filename); + Selector->filename = strdup(savename); + savename = NULL; + free(Selector->filename_unicode); + Selector->filename_unicode = Unicode_strdup(Selector_filename_unicode_save); + Selector_filename_unicode_save = NULL; } - free(savename); } + free(savename); + free(Selector_filename_unicode_save); Print_filename_in_fileselector(); Display_cursor(); } @@ -2036,31 +2037,37 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context { char filename_ansi[256]; word filename_unicode[256]; + word * save_filename_unicode = Unicode_strdup(Selector->filename_unicode); - // Save the filename - strcpy(save_filename, Selector_filename); - Unicode_strlcpy(save_filename_unicode, Selector_filename_unicode, 256); + free(save_filename); + save_filename = strdup(Selector->filename); // Check if the selected entry is a drive/directory : // in, this case, clear the filename if (Filelist.Nb_elements>0) { T_Fileselector_item * current_item; current_item = Get_item_by_index(&Filelist, Selector->Position + Selector->Offset); - if (current_item->Type != FSOBJECT_FILE && !FILENAME_COMPARE(current_item->Full_name,Selector_filename)) + if (current_item->Type != FSOBJECT_FILE && !FILENAME_COMPARE(current_item->Full_name, Selector->filename)) { // current name is a highlighted directory - Selector_filename[0]='\0'; - Selector_filename_unicode[0]=0; + free(Selector->filename); + Selector->filename = NULL; + free(Selector->filename_unicode); + Selector->filename_unicode = NULL; } } - strncpy(filename_ansi, Selector_filename, sizeof(filename_ansi)); - if (Selector_filename_unicode[0] == 0 && strlen(Selector_filename) > 0) - Unicode_char_strlcpy(filename_unicode, Selector_filename, sizeof(filename_unicode)/sizeof(word)); + if (Selector->filename != NULL) + strncpy(filename_ansi, Selector->filename, sizeof(filename_ansi)); else - Unicode_strlcpy(filename_unicode, Selector_filename_unicode, sizeof(filename_unicode)/sizeof(word)); + filename_ansi[0] = '\0'; + filename_unicode[0] = '\0'; + if (Selector->filename_unicode != NULL && Selector->filename_unicode[0] != 0) + Unicode_strlcpy(filename_unicode, Selector->filename_unicode, sizeof(filename_unicode)/sizeof(word)); + else if (Selector->filename != NULL && strlen(Selector->filename) > 0) + Unicode_char_strlcpy(filename_unicode, Selector->filename, sizeof(filename_unicode)/sizeof(word)); #ifdef ENABLE_FILENAMES_ICONV { /* convert from UTF8 to ANSI */ - char * input = (char *)Selector_filename; + char * input = (char *)Selector->filename; size_t inbytesleft = strlen(input); char * output = filename_ansi; size_t outbytesleft = sizeof(filename_ansi)-1; @@ -2075,8 +2082,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context #endif { #if defined(WIN32) - DWORD short_len; - short_len = GetShortPathNameW((WCHAR *)filename_unicode, NULL, 0); + DWORD short_len = GetShortPathNameW((WCHAR *)filename_unicode, NULL, 0); if (short_len > 0) { WCHAR * temp_str = (WCHAR *)malloc(short_len * sizeof(WCHAR)); @@ -2104,25 +2110,20 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context /* convert back from UTF16 to UTF8 */ char * input = (char *)filename_unicode; size_t inbytesleft = 2 * Unicode_strlen(filename_unicode); - char * output = Selector_filename; - size_t outbytesleft = sizeof(Selector_filename)-1; + char * output = filename_ansi; + size_t outbytesleft = sizeof(filename_ansi)-1; if(cd_utf16_inv != (iconv_t)-1 && (ssize_t)iconv(cd_utf16_inv, &input, &inbytesleft, &output, &outbytesleft) >= 0) *output = '\0'; - else #endif - strncpy(Selector_filename, filename_ansi, sizeof(Selector_filename)); -#if defined(WIN32) || defined(ENABLE_FILENAMES_ICONV) - Unicode_strlcpy(Selector_filename_unicode, filename_unicode, sizeof(Selector_filename_unicode)/sizeof(word)); -#endif // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. - for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); temp++) - if (Selector_filename[temp]=='.') + for(temp=0, dummy=0; ((filename_ansi[temp]) && (!dummy)); temp++) + if (filename_ansi[temp]=='.') dummy=1; if (!dummy) { - if(!Directory_exists(Selector_filename)) + if(!Directory_exists(filename_ansi)) { const char * ext = Get_fileformat(Selector->Format_filter)->Default_extension; // put default extension @@ -2130,16 +2131,25 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // something suitable ?) if (ext == NULL) ext = "pkm"; - strcat(Selector_filename, "."); - strcat(Selector_filename, ext); - Unicode_char_strlcat(Selector_filename_unicode, ".", sizeof(Selector_filename_unicode)/sizeof(word)); - Unicode_char_strlcat(Selector_filename_unicode, ext, sizeof(Selector_filename_unicode)/sizeof(word)); + strcat(filename_ansi, "."); + strcat(filename_ansi, ext); + Unicode_char_strlcat(filename_unicode, ".", sizeof(filename_unicode)/sizeof(word)); + Unicode_char_strlcat(filename_unicode, ext, sizeof(filename_unicode)/sizeof(word)); } } + + free(Selector->filename); + Selector->filename = strdup(filename_ansi); + free(Selector->filename_unicode); +#if defined(WIN32) || defined(ENABLE_FILENAMES_ICONV) + Selector->filename_unicode = Unicode_strdup(filename_unicode); +#else + Selector->filename_unicode = NULL; +#endif if(load) // Determine the type - Selected_type = (File_exists(Selector_filename) && !Directory_exists(Selector_filename)) ? FSOBJECT_FILE : FSOBJECT_DIR; + Selected_type = (File_exists(Selector->filename) && !Directory_exists(Selector->filename)) ? FSOBJECT_FILE : FSOBJECT_DIR; else - Selected_type = Directory_exists(Selector_filename) ? FSOBJECT_DIR : FSOBJECT_FILE; + Selected_type = Directory_exists(Selector->filename) ? FSOBJECT_DIR : FSOBJECT_FILE; // Now load immediately, but only if the user exited readline by pressing ENTER if (Mouse_K == 0) has_clicked_ok = 1; @@ -2147,9 +2157,15 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context else { // Restore the old filename - strcpy(Selector_filename, save_filename); - Unicode_strlcpy(Selector_filename_unicode, save_filename_unicode, sizeof(Selector_filename_unicode)/sizeof(word)); + free(Selector->filename); + Selector->filename = save_filename; // steal buffer + save_filename = NULL; + free(Selector->filename_unicode); + Selector->filename_unicode = save_filename_unicode; // steal buffer + save_filename_unicode = NULL; } + free(save_filename_unicode); + save_filename_unicode = NULL; Print_filename_in_fileselector(); Display_cursor(); break; @@ -2175,8 +2191,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // paste from clipboard load_from_clipboard = 1; New_preview_is_needed = 1; - strcpy(Selector_filename, "* CLIPBOARD *"); - Selector_filename_unicode[0] = 0; + free(Selector->filename); + Selector->filename = strdup("* CLIPBOARD *"); + free(Selector->filename_unicode); + Selector->filename_unicode = NULL; Hide_cursor(); Print_filename_in_fileselector(); Display_cursor(); @@ -2207,7 +2225,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context { GFX2_Log(GFX2_DEBUG,"Go to bookmark %s\n", Config.Bookmark_directory[clicked_button-10]); // backup the currently selected filename - strncpy(save_filename, Selector_filename, sizeof(save_filename)); + free(save_filename); + save_filename = strdup(Selector->filename); // simulate a click on the bookmarked directory directory_to_change_to = Config.Bookmark_directory[clicked_button-10]; Reset_quicksearch(); @@ -2356,10 +2375,12 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context if (Filelist.Nb_elements && !strcmp(Filelist.First->Full_name,PARENT_DIR)) { // On va dans le répertoire parent. - strcpy(Selector_filename,PARENT_DIR); - Selector_filename_unicode[0] = 0; - Selected_type=FSOBJECT_DIR; - has_clicked_ok=1; + free(Selector->filename); + Selector->filename = strdup(PARENT_DIR); + free(Selector->filename_unicode); + Selector->filename_unicode = NULL; + Selected_type = FSOBJECT_DIR; + has_clicked_ok = 1; } Key=0; break; @@ -2408,7 +2429,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context has_clicked_ok=0; if (directory_to_change_to == NULL) - directory_to_change_to = Selector_filename; + directory_to_change_to = Selector->filename; // We must enter the directory @@ -2449,10 +2470,11 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context Sort_list_of_files(&Filelist); // Set the fileselector bar on the directory we're coming from pos = Find_file_in_fileselector(&Filelist, previous_directory); - strcpy(Selector_filename, previous_directory); - free(previous_directory); - if (!Get_Unicode_Filename(Selector_filename_unicode, Selector_filename, ".")) - Selector_filename_unicode[0] = 0; + free(Selector->filename); + Selector->filename = previous_directory; // Steal heap buffer + previous_directory = NULL; + free(Selector->filename_unicode); + Selector->filename_unicode = Get_Unicode_Filename(NULL, Selector->filename, "."); Highlight_file((pos >= 0) ? pos : 0); // display the 1st visible files Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller,0); @@ -2471,7 +2493,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context GFX2_Log(GFX2_WARNING, "Current directory is \"%s\"", current_dir); free(current_dir); // restore Selector_filename - strncpy(Selector_filename, save_filename, sizeof(Selector_filename)); + free(Selector->filename); + Selector->filename = save_filename; // steal heap buffer + save_filename = NULL; Error(0); } directory_to_change_to = NULL; @@ -2484,6 +2508,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context save_or_load_image=1; } } + free(save_filename); + save_filename = NULL; // Gestion du chrono et des previews if (New_preview_is_needed) @@ -2537,9 +2563,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context } else { - Init_context_preview(&preview_context, Selector_filename, Selector->Directory); + Init_context_preview(&preview_context, Selector->filename, Selector->Directory); preview_context.Format = Selector->Format_filter; - preview_context.File_name_unicode = Unicode_strdup(Selector_filename_unicode); + preview_context.File_name_unicode = Unicode_strdup(Selector->filename_unicode); } Hide_cursor(); if (context->Type == CONTEXT_PALETTE) @@ -2569,8 +2595,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context } else { - context->File_name = strdup(Selector_filename); - context->File_name_unicode = Unicode_strdup(Selector_filename_unicode); + context->File_name = strdup(Selector->filename); + context->File_name_unicode = Unicode_strdup(Selector->filename_unicode); free(context->File_directory); context->File_directory = strdup(Selector->Directory); if (!load) diff --git a/src/main.c b/src/main.c index e741e406..77723cca 100644 --- a/src/main.c +++ b/src/main.c @@ -1293,12 +1293,20 @@ void Program_shutdown(void) FREE_POINTER(Main.selector.Directory); FREE_POINTER(Main.selector.Directory_unicode); + FREE_POINTER(Main.selector.filename); + FREE_POINTER(Main.selector.filename_unicode); FREE_POINTER(Spare.selector.Directory); FREE_POINTER(Spare.selector.Directory_unicode); + FREE_POINTER(Spare.selector.filename); + FREE_POINTER(Spare.selector.filename_unicode); FREE_POINTER(Brush_selector.Directory); FREE_POINTER(Brush_selector.Directory_unicode); + FREE_POINTER(Brush_selector.filename); + FREE_POINTER(Brush_selector.filename_unicode); FREE_POINTER(Palette_selector.Directory); FREE_POINTER(Palette_selector.Directory_unicode); + FREE_POINTER(Palette_selector.filename); + FREE_POINTER(Palette_selector.filename_unicode); // Free Config FREE_POINTER(Config.Skin_file); diff --git a/src/struct.h b/src/struct.h index c74df826..1f54904a 100644 --- a/src/struct.h +++ b/src/struct.h @@ -557,6 +557,8 @@ typedef struct T_Selector_settings short Offset; ///< Position of the "highlight" bar in the file list char * Directory; ///< Directory currently browsed word * Directory_unicode; ///< Directory currently browsed + char * filename; ///< Filename (without directory) of the highlighted file + word * filename_unicode; ///< /// Filename (without directory) of the highlighted file } T_Selector_settings; /// structure for Main or Spare page global data