win32: fix long path display in fileselector

This commit is contained in:
Thomas Bernard 2019-05-28 18:40:14 +02:00
parent 44d36c94dc
commit a0b60f2e49
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C

View File

@ -973,44 +973,44 @@ char * Get_current_directory(char * buf, word * * unicode, size_t size)
return buf; return buf;
#elif defined(WIN32) #elif defined(WIN32)
WCHAR * long_dir, * short_dir; WCHAR * cur_dir, * short_dir;
size_t size_long, size_short; size_t size_cur, size_short;
size_t i; size_t i;
// first get the current directory in unicode // first get the current directory in unicode
size_long = (size_t)GetCurrentDirectoryW(0, NULL); size_cur = (size_t)GetCurrentDirectoryW(0, NULL);
if (size_long == 0) if (size_cur == 0)
{ {
GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(0, NULL) failed !\n"); GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(0, NULL) failed !\n");
return NULL; return NULL;
} }
long_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_long); cur_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_cur);
if (long_dir == NULL) if (cur_dir == NULL)
return NULL; return NULL;
if (GetCurrentDirectoryW(size_long, long_dir) == 0) if (GetCurrentDirectoryW(size_cur, cur_dir) == 0)
{ {
GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(%u, %p) failed !\n", (unsigned)size_long, long_dir); GFX2_Log(GFX2_ERROR, "GetCurrentDirectoryW(%u, %p) failed !\n", (unsigned)size_cur, cur_dir);
return NULL; return NULL;
} }
// then convert to "short" path (ie C:\PROGRA~1\...) // convert to "short" path (ie C:\PROGRA~1\...)
size_short = (size_t)GetShortPathNameW(long_dir, NULL, 0); size_short = (size_t)GetShortPathNameW(cur_dir, NULL, 0);
if (size_short == 0) if (size_short == 0)
{ {
GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, NULL, 0) failed !\n", long_dir); GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, NULL, 0) failed !\n", cur_dir);
free(long_dir); free(cur_dir);
return NULL; return NULL;
} }
short_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_short); short_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_short);
if (short_dir == NULL) if (short_dir == NULL)
{ {
free(long_dir); free(cur_dir);
return NULL; return NULL;
} }
if (GetShortPathNameW(long_dir, short_dir, size_short) == 0) if (GetShortPathNameW(cur_dir, short_dir, size_short) == 0)
{ {
GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, %p, %u) failed !\n", long_dir, short_dir, (unsigned)size_short); GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, %p, %u) failed !\n", cur_dir, short_dir, (unsigned)size_short);
free(long_dir); free(cur_dir);
free(short_dir); free(short_dir);
return NULL; return NULL;
} }
@ -1022,7 +1022,7 @@ char * Get_current_directory(char * buf, word * * unicode, size_t size)
buf = (char *)GFX2_malloc(size); buf = (char *)GFX2_malloc(size);
if (buf == NULL) if (buf == NULL)
{ {
free(long_dir); free(cur_dir);
free(short_dir); free(short_dir);
return NULL; return NULL;
} }
@ -1031,10 +1031,33 @@ char * Get_current_directory(char * buf, word * * unicode, size_t size)
buf[i] = (char)short_dir[i]; buf[i] = (char)short_dir[i];
buf[i] = '\0'; buf[i] = '\0';
free(short_dir); free(short_dir);
if (unicode != NULL) if (unicode != NULL)
*unicode = long_dir; {
else WCHAR * long_dir;
free(long_dir); size_t size_long;
*unicode = NULL;
// convert to "long" path for display
size_long = (size_t)GetLongPathNameW(cur_dir, NULL, 0);
if (size_long == 0)
GFX2_Log(GFX2_ERROR, "GetLongPathNameW(%p, NULL, 0) failed !\n", cur_dir);
else
{
long_dir = (WCHAR *)GFX2_malloc(sizeof(WCHAR) * size_long);
if (long_dir != NULL)
{
if (GetLongPathNameW(cur_dir, long_dir, size_long) == 0)
{
GFX2_Log(GFX2_ERROR, "GetLongPathNameW(%p, %p, %u) failed !\n", cur_dir, long_dir, (unsigned)size_long);
free(long_dir);
}
else
*unicode = (word *)long_dir;
}
}
}
free(cur_dir);
return buf; return buf;
#else #else
char * ret = getcwd(buf, size); char * ret = getcwd(buf, size);