Display the current directory in unicode
rename function Print_in_window_utf16() to Print_in_window_unicode()
This commit is contained in:
parent
b882eb9fe4
commit
9a03a54fef
@ -2009,7 +2009,7 @@ int L_Run(lua_State* L)
|
|||||||
return luaL_error(L, "run: too many nested calls (100)");
|
return luaL_error(L, "run: too many nested calls (100)");
|
||||||
|
|
||||||
// store the current directory (on the stack)
|
// store the current directory (on the stack)
|
||||||
Get_current_directory(saved_directory,MAX_PATH_CHARACTERS);
|
Get_current_directory(saved_directory, NULL, MAX_PATH_CHARACTERS);
|
||||||
|
|
||||||
#if defined (__AROS__)
|
#if defined (__AROS__)
|
||||||
// Convert path written on Linux/Windows norms to AROS norms :
|
// Convert path written on Linux/Windows norms to AROS norms :
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
*/
|
*/
|
||||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2018 Thomas Bernard
|
||||||
Copyright 2014 Sergii Pylypenko
|
Copyright 2014 Sergii Pylypenko
|
||||||
Copyright 2011 Pawel Góralski
|
Copyright 2011 Pawel Góralski
|
||||||
Copyright 2009 Franck Charlet
|
Copyright 2009 Franck Charlet
|
||||||
@ -134,7 +135,7 @@ byte Native_filesel(byte load)
|
|||||||
|
|
||||||
// -- Fileselector data
|
// -- Fileselector data
|
||||||
|
|
||||||
T_Fileselector Filelist;
|
static T_Fileselector Filelist;
|
||||||
|
|
||||||
/// Selector settings to use, for all functions called by Load_or_save
|
/// Selector settings to use, for all functions called by Load_or_save
|
||||||
T_Selector_settings * Selector;
|
T_Selector_settings * Selector;
|
||||||
@ -540,7 +541,7 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
|
|||||||
// Après effacement, il ne reste ni fichier ni répertoire dans la liste
|
// Après effacement, il ne reste ni fichier ni répertoire dans la liste
|
||||||
|
|
||||||
// On lit tous les répertoires:
|
// On lit tous les répertoires:
|
||||||
current_path = Get_current_directory(curdir, MAX_PATH_CHARACTERS);
|
current_path = Get_current_directory(curdir, NULL, MAX_PATH_CHARACTERS);
|
||||||
|
|
||||||
For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
|
For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
|
||||||
|
|
||||||
@ -965,7 +966,7 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o
|
|||||||
{
|
{
|
||||||
// Name without icon
|
// Name without icon
|
||||||
if (current_item->Unicode_short_name)
|
if (current_item->Unicode_short_name)
|
||||||
Print_in_window_utf16(8,95+index*8,current_item->Unicode_short_name,text_color,background_color);
|
Print_in_window_unicode(8,95+index*8,current_item->Unicode_short_name,text_color,background_color);
|
||||||
else
|
else
|
||||||
Print_in_window(8,95+index*8,current_item->Short_name,text_color,background_color);
|
Print_in_window(8,95+index*8,current_item->Short_name,text_color,background_color);
|
||||||
}
|
}
|
||||||
@ -1166,11 +1167,10 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
|
|||||||
|
|
||||||
void Print_current_directory(void)
|
void Print_current_directory(void)
|
||||||
//
|
//
|
||||||
// Affiche Selector->Directory sur 37 caractères
|
// Shows Selector->Directory on 37 chars
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
char converted_name[MAX_PATH_CHARACTERS];
|
char converted_name[MAX_PATH_CHARACTERS];
|
||||||
char temp_name[MAX_DISPLAYABLE_PATH+1]; // Nom tronqué
|
|
||||||
int length; // length du répertoire courant
|
int length; // length du répertoire courant
|
||||||
int index; // index de parcours de la chaine complète
|
int index; // index de parcours de la chaine complète
|
||||||
|
|
||||||
@ -1190,34 +1190,60 @@ void Print_current_directory(void)
|
|||||||
|
|
||||||
Window_rectangle(10,84,37*8,8,MC_Light);
|
Window_rectangle(10,84,37*8,8,MC_Light);
|
||||||
|
|
||||||
length=strlen(converted_name);
|
if (Selector->Directory_unicode[0] != 0)
|
||||||
if (length>MAX_DISPLAYABLE_PATH)
|
{
|
||||||
{ // Doh! il va falloir tronquer le répertoire (bouh !)
|
length=Unicode_strlen(Selector->Directory_unicode);
|
||||||
|
if (length>MAX_DISPLAYABLE_PATH)
|
||||||
|
{ // We need to truncate the directory
|
||||||
|
word temp_name[MAX_DISPLAYABLE_PATH+1]; // truncated name
|
||||||
|
|
||||||
// On commence par copier bêtement les 3 premiers caractères (e.g. "C:\")
|
memcpy(temp_name, Selector->Directory_unicode, 3*2); // first 3 chars "C:\"
|
||||||
for (index=0;index<3;index++)
|
Unicode_char_strlcpy(temp_name+3, "...", MAX_DISPLAYABLE_PATH+1-3);
|
||||||
temp_name[index]=converted_name[index];
|
|
||||||
|
|
||||||
// On y rajoute 3 petits points:
|
// next we look for a place to fit everything ;)
|
||||||
strcpy(temp_name+3,"...");
|
for (index=3;index<length;index++)
|
||||||
|
if ( (Selector->Directory_unicode[index]==PATH_SEPARATOR[0]) &&
|
||||||
|
(length-index<=MAX_DISPLAYABLE_PATH-6) )
|
||||||
|
{
|
||||||
|
// we found the place !
|
||||||
|
Unicode_strlcpy(temp_name+6,Selector->Directory_unicode+index, MAX_DISPLAYABLE_PATH+1-6);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Ensuite, on cherche un endroit à partir duquel on pourrait loger tout
|
Print_in_window_unicode(10,84,temp_name,MC_Black,MC_Light);
|
||||||
// le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!)
|
}
|
||||||
for (index++;index<length;index++)
|
else // The string is short enough
|
||||||
if ( (converted_name[index]==PATH_SEPARATOR[0]) &&
|
Print_in_window_unicode(10,84,Selector->Directory_unicode,MC_Black,MC_Light);
|
||||||
(length-index<=MAX_DISPLAYABLE_PATH-6) )
|
}
|
||||||
{
|
else
|
||||||
// Ouf: on vient de trouver un endroit dans la chaîne à partir duquel
|
{
|
||||||
// on peut faire la copie:
|
length=strlen(converted_name);
|
||||||
strcpy(temp_name+6,converted_name+index);
|
if (length>MAX_DISPLAYABLE_PATH)
|
||||||
break;
|
{ // We need to truncate the directory
|
||||||
}
|
char temp_name[MAX_DISPLAYABLE_PATH+1]; // truncated name
|
||||||
|
|
||||||
// Enfin, on peut afficher la chaîne tronquée
|
for (index=0;index<3;index++) // copy the first 3 chars "C:\"
|
||||||
Print_in_window(10,84,temp_name,MC_Black,MC_Light);
|
temp_name[index]=converted_name[index];
|
||||||
|
|
||||||
|
// Add ...
|
||||||
|
strcpy(temp_name+3,"...");
|
||||||
|
|
||||||
|
// next we look for a place to fit everything ;)
|
||||||
|
for (index++;index<length;index++)
|
||||||
|
if ( (converted_name[index]==PATH_SEPARATOR[0]) &&
|
||||||
|
(length-index<=MAX_DISPLAYABLE_PATH-6) )
|
||||||
|
{
|
||||||
|
// we found the place !
|
||||||
|
strcpy(temp_name+6,converted_name+index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// display truncated string
|
||||||
|
Print_in_window(10,84,temp_name,MC_Black,MC_Light);
|
||||||
|
}
|
||||||
|
else // The string is short enough
|
||||||
|
Print_in_window(10,84,converted_name,MC_Black,MC_Light);
|
||||||
}
|
}
|
||||||
else // Ahhh! La chaîne peut loger tranquillement dans la fenêtre
|
|
||||||
Print_in_window(10,84,converted_name,MC_Black,MC_Light);
|
|
||||||
|
|
||||||
Update_window_area(10,84,37*8,8);
|
Update_window_area(10,84,37*8,8);
|
||||||
}
|
}
|
||||||
@ -1244,7 +1270,7 @@ void Print_filename_in_fileselector(void)
|
|||||||
{
|
{
|
||||||
word filename_unicode[32];
|
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_utf16(82,48,filename_unicode,MC_Black,MC_Light);
|
Print_in_window_unicode(82,48,filename_unicode,MC_Black,MC_Light);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Print_in_window_limited(82,48,filename,27,MC_Black,MC_Light);
|
Print_in_window_limited(82,48,filename,27,MC_Black,MC_Light);
|
||||||
@ -1628,7 +1654,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
|
|||||||
}
|
}
|
||||||
|
|
||||||
Change_directory(context->File_directory);
|
Change_directory(context->File_directory);
|
||||||
Get_current_directory(Selector->Directory,MAX_PATH_CHARACTERS);
|
Get_current_directory(Selector->Directory, Selector->Directory_unicode, MAX_PATH_CHARACTERS);
|
||||||
|
|
||||||
// Affichage des premiers fichiers visibles:
|
// Affichage des premiers fichiers visibles:
|
||||||
Reload_list_of_files(Selector->Format_filter,file_scroller);
|
Reload_list_of_files(Selector->Format_filter,file_scroller);
|
||||||
@ -2176,7 +2202,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
|
|||||||
Extract_filename(previous_directory, Selector->Directory);
|
Extract_filename(previous_directory, Selector->Directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
Get_current_directory(Selector->Directory,MAX_PATH_CHARACTERS);
|
Get_current_directory(Selector->Directory, Selector->Directory_unicode, MAX_PATH_CHARACTERS);
|
||||||
// read the new directory
|
// read the new directory
|
||||||
Read_list_of_files(&Filelist, Selector->Format_filter);
|
Read_list_of_files(&Filelist, Selector->Format_filter);
|
||||||
Sort_list_of_files(&Filelist);
|
Sort_list_of_files(&Filelist);
|
||||||
|
|||||||
29
src/io.c
29
src/io.c
@ -545,7 +545,7 @@ void Release_lock_file(const char *file_directory)
|
|||||||
remove(lock_filename);
|
remove(lock_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * Get_current_directory(char * buf, size_t size)
|
const char * Get_current_directory(char * buf, word * buf_unicode, size_t size)
|
||||||
{
|
{
|
||||||
#if defined(__MINT__)
|
#if defined(__MINT__)
|
||||||
buf[0] = 'A'+Dgetdrv();
|
buf[0] = 'A'+Dgetdrv();
|
||||||
@ -554,9 +554,34 @@ const char * Get_current_directory(char * buf, size_t size)
|
|||||||
Dgetpath(buf+3,0);
|
Dgetpath(buf+3,0);
|
||||||
strcat(buf,PATH_SEPARATOR);
|
strcat(buf,PATH_SEPARATOR);
|
||||||
|
|
||||||
|
if (buf_unicode != NULL)
|
||||||
|
buf_unicode[0] = 0; // no unicode support
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
#else
|
#else
|
||||||
return getcwd(buf, size);
|
char * ret = getcwd(buf, size);
|
||||||
|
#ifdef ENABLE_FILENAMES_ICONV
|
||||||
|
if (ret != NULL && buf_unicode != NULL)
|
||||||
|
{
|
||||||
|
char * input = buf;
|
||||||
|
size_t inbytesleft = strlen(buf);
|
||||||
|
char * output = (char *)buf_unicode;
|
||||||
|
size_t outbytesleft = 2 * (size - 1);
|
||||||
|
if (cd_utf16 != (iconv_t)-1)
|
||||||
|
{
|
||||||
|
size_t r = iconv(cd_utf16, &input, &inbytesleft, &output, &outbytesleft);
|
||||||
|
if (r != (size_t)-1)
|
||||||
|
{
|
||||||
|
output[0] = '\0';
|
||||||
|
output[1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (buf_unicode != NULL)
|
||||||
|
buf_unicode[0] = 0; // no unicode support
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
src/io.h
2
src/io.h
@ -130,7 +130,7 @@ void Release_lock_file(const char *file_directory);
|
|||||||
|
|
||||||
///
|
///
|
||||||
/// Return the current directory, equivalent to getcwd()
|
/// Return the current directory, equivalent to getcwd()
|
||||||
const char * Get_current_directory(char * buf, size_t size);
|
const char * Get_current_directory(char * buf, word * buf_unicode, size_t size);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Change current directory. return 0 for success, -1 in case of error
|
/// Change current directory. return 0 for success, -1 in case of error
|
||||||
|
|||||||
21
src/main.c
21
src/main.c
@ -473,6 +473,17 @@ int Init_program(int argc,char * argv[])
|
|||||||
printf("===============================\n");
|
printf("===============================\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_FILENAMES_ICONV
|
||||||
|
// iconv is used to convert filenames
|
||||||
|
cd = iconv_open(TOCODE, FROMCODE); // From UTF8 to ANSI
|
||||||
|
cd_inv = iconv_open(FROMCODE, TOCODE); // From ANSI to UTF8
|
||||||
|
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||||
|
cd_utf16 = iconv_open("UTF-16BE", FROMCODE); // From UTF8 to UTF16
|
||||||
|
#else
|
||||||
|
cd_utf16 = iconv_open("UTF-16LE", FROMCODE); // From UTF8 to UTF16
|
||||||
|
#endif
|
||||||
|
#endif /* ENABLE_FILENAMES_ICONV */
|
||||||
|
|
||||||
// On crée dès maintenant les descripteurs des listes de pages pour la page
|
// On crée dès maintenant les descripteurs des listes de pages pour la page
|
||||||
// principale et la page de brouillon afin que leurs champs ne soient pas
|
// principale et la page de brouillon afin que leurs champs ne soient pas
|
||||||
// invalide lors des appels aux multiples fonctions manipulées à
|
// invalide lors des appels aux multiples fonctions manipulées à
|
||||||
@ -489,15 +500,7 @@ int Init_program(int argc,char * argv[])
|
|||||||
// Choose directory for settings (read/write)
|
// Choose directory for settings (read/write)
|
||||||
Set_config_directory(program_directory,Config_directory);
|
Set_config_directory(program_directory,Config_directory);
|
||||||
// On détermine le répertoire courant:
|
// On détermine le répertoire courant:
|
||||||
Get_current_directory(Main.selector.Directory,MAX_PATH_CHARACTERS);
|
Get_current_directory(Main.selector.Directory,Main.selector.Directory_unicode,MAX_PATH_CHARACTERS);
|
||||||
|
|
||||||
#ifdef ENABLE_FILENAMES_ICONV
|
|
||||||
// Initialisation de iconv
|
|
||||||
// utilisé pour convertir les noms de fichiers
|
|
||||||
cd = iconv_open(TOCODE, FROMCODE); // From UTF8 to ANSI
|
|
||||||
cd_inv = iconv_open(FROMCODE, TOCODE); // From ANSI to UTF8
|
|
||||||
cd_utf16 = iconv_open("UTF-16LE", FROMCODE); // From UTF8 to UTF16
|
|
||||||
#endif /* ENABLE_FILENAMES_ICONV */
|
|
||||||
|
|
||||||
// On en profite pour le mémoriser dans le répertoire principal:
|
// On en profite pour le mémoriser dans le répertoire principal:
|
||||||
strcpy(Initial_directory,Main.selector.Directory);
|
strcpy(Initial_directory,Main.selector.Directory);
|
||||||
|
|||||||
@ -549,6 +549,7 @@ typedef struct T_Selector_settings
|
|||||||
short Position; ///< Index of the first file/entry to display in list
|
short Position; ///< Index of the first file/entry to display in list
|
||||||
short Offset; ///< Position of the "highlight" bar in the file list
|
short Offset; ///< Position of the "highlight" bar in the file list
|
||||||
char Directory[MAX_PATH_CHARACTERS]; ///< Directory currently browsed
|
char Directory[MAX_PATH_CHARACTERS]; ///< Directory currently browsed
|
||||||
|
word Directory_unicode[MAX_PATH_CHARACTERS]; ///< Directory currently browsed
|
||||||
} T_Selector_settings;
|
} T_Selector_settings;
|
||||||
|
|
||||||
/// structure for Main or Spare page global data
|
/// structure for Main or Spare page global data
|
||||||
|
|||||||
@ -762,7 +762,7 @@ void Print_in_window(short x,short y,const char * str,byte text_color,byte backg
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Draws a string in a window
|
/// Draws a string in a window
|
||||||
void Print_in_window_utf16(short x,short y,const word * str,byte text_color,byte background_color)
|
void Print_in_window_unicode(short x,short y,const word * str,byte text_color,byte background_color)
|
||||||
{
|
{
|
||||||
short x_pos = x;
|
short x_pos = x;
|
||||||
const word * p = str;
|
const word * p = str;
|
||||||
|
|||||||
@ -67,7 +67,7 @@ word Palette_cells_Y(void);
|
|||||||
|
|
||||||
void Print_general(short x,short y,const char * str,byte text_color,byte background_color);
|
void Print_general(short x,short y,const char * str,byte text_color,byte background_color);
|
||||||
void Print_in_window(short x,short y,const char * str,byte text_color,byte background_color);
|
void Print_in_window(short x,short y,const char * str,byte text_color,byte background_color);
|
||||||
void Print_in_window_utf16(short x,short y,const word * str,byte text_color,byte background_color);
|
void Print_in_window_unicode(short x,short y,const word * str,byte text_color,byte background_color);
|
||||||
void Print_in_window_limited(short x,short y,const char * str,byte size,byte text_color,byte background_color);
|
void Print_in_window_limited(short x,short y,const char * str,byte size,byte text_color,byte background_color);
|
||||||
void Print_char_in_window(short x_pos,short y_pos, unsigned int c,byte text_color,byte background_color);
|
void Print_char_in_window(short x_pos,short y_pos, unsigned int c,byte text_color,byte background_color);
|
||||||
void Print_in_menu(const char * str, short position);
|
void Print_in_menu(const char * str, short position);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user