Browse Source

Add partial Unicode handling of filenames on Windows.

tags/v1.0.0
Andrew Belt 5 years ago
parent
commit
53a63187fe
4 changed files with 36 additions and 14 deletions
  1. +1
    -1
      dep/osdialog
  2. +19
    -5
      src/asset.cpp
  3. +1
    -1
      src/main.cpp
  4. +15
    -7
      src/system.cpp

+ 1
- 1
dep/osdialog

@@ -1 +1 @@
Subproject commit e76001cea2ae805f6315bb916d902272736913a4
Subproject commit 724b4287eae674779855adaf250b9ae2ebe85f72

+ 19
- 5
src/asset.cpp View File

@@ -43,10 +43,18 @@ void init() {
systemDir = resourcesBuf;
#endif
#if defined ARCH_WIN
char moduleBuf[MAX_PATH];
DWORD length = GetModuleFileName(NULL, moduleBuf, sizeof(moduleBuf));
// Get path to executable
wchar_t moduleBufW[MAX_PATH];
DWORD length = GetModuleFileNameW(NULL, moduleBufW, LENGTHOF(moduleBufW));
assert(length > 0);
PathRemoveFileSpec(moduleBuf);
// Get folder of executable
PathRemoveFileSpecW(moduleBufW);
// Convert to short path to avoid Unicode
wchar_t moduleBufShortW[MAX_PATH];
GetShortPathNameW(moduleBufW, moduleBufShortW, LENGTHOF(moduleBufShortW));
// Convert to UTF-8.
char moduleBuf[MAX_PATH];
WideCharToMultiByte(CP_UTF8, 0, moduleBufShortW, -1, moduleBuf, sizeof(moduleBuf), NULL, NULL);
systemDir = moduleBuf;
#endif
#if defined ARCH_LIN
@@ -64,9 +72,15 @@ void init() {
else {
#if defined ARCH_WIN
// Get "My Documents" folder
wchar_t documentsBufW[MAX_PATH] = L".";
HRESULT result = SHGetFolderPathW(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, documentsBufW);
// assert(result == S_OK);
// Convert to short path to avoid Unicode
wchar_t documentsBufShortW[MAX_PATH];
GetShortPathNameW(documentsBufW, documentsBufShortW, LENGTHOF(documentsBufShortW));
// Convert to UTF-8.
char documentsBuf[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, documentsBuf);
assert(result == S_OK);
WideCharToMultiByte(CP_UTF8, 0, documentsBufShortW, -1, documentsBuf, sizeof(documentsBuf), NULL, NULL);
userDir = documentsBuf;
userDir += "/Rack";
#endif


+ 1
- 1
src/main.cpp View File

@@ -48,7 +48,7 @@ int main(int argc, char *argv[]) {
#if defined ARCH_WIN
// Windows global mutex to prevent multiple instances
// Handle will be closed by Windows when the process ends
HANDLE instanceMutex = CreateMutex(NULL, true, app::APP_NAME);
HANDLE instanceMutex = CreateMutexA(NULL, true, app::APP_NAME);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported.");
exit(1);


+ 15
- 7
src/system.cpp View File

@@ -85,7 +85,9 @@ void copyFile(const std::string &srcPath, const std::string &destPath) {

void createDirectory(const std::string &path) {
#if defined ARCH_WIN
CreateDirectory(path.c_str(), NULL);
wchar_t pathW[MAX_PATH];
MultiByteToWideChar(CP_UTF8, 0, path.c_str(), -1, pathW, LENGTHOF(pathW));
CreateDirectoryW(pathW, NULL);
#else
mkdir(path.c_str(), 0755);
#endif
@@ -160,7 +162,9 @@ void openBrowser(const std::string &url) {
std::system(command.c_str());
#endif
#if defined ARCH_WIN
ShellExecute(NULL, "open", url.c_str(), NULL, NULL, SW_SHOWNORMAL);
wchar_t urlW[1024];
MultiByteToWideChar(CP_UTF8, 0, url.c_str(), -1, urlW, LENGTHOF(urlW));
ShellExecuteW(NULL, L"open", urlW, NULL, NULL, SW_SHOWNORMAL);
#endif
}

@@ -170,21 +174,25 @@ void openFolder(const std::string &path) {
(void) std::system(command.c_str());
#endif
#if defined ARCH_WIN
ShellExecute(NULL, "explorer", path.c_str(), NULL, NULL, SW_SHOWNORMAL);
wchar_t pathW[MAX_PATH];
MultiByteToWideChar(CP_UTF8, 0, path.c_str(), -1, pathW, LENGTHOF(pathW));
ShellExecuteW(NULL, L"explorer", pathW, NULL, NULL, SW_SHOWNORMAL);
#endif
}


void runProcessAsync(const std::string &path) {
#if defined ARCH_WIN
STARTUPINFO startupInfo;
STARTUPINFOW startupInfo;
PROCESS_INFORMATION processInfo;

std::memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
std::memset(&processInfo, 0, sizeof(processInfo));

CreateProcessA(path.c_str(), NULL,
wchar_t pathW[MAX_PATH];
MultiByteToWideChar(CP_UTF8, 0, path.c_str(), -1, pathW, LENGTHOF(pathW));
CreateProcessW(pathW, NULL,
NULL, NULL, false, 0, NULL, NULL,
&startupInfo, &processInfo);
#endif
@@ -197,10 +205,10 @@ std::string getOperatingSystemInfo() {
uname(&u);
return string::f("%s %s %s %s", u.sysname, u.release, u.version, u.machine);
#elif defined ARCH_WIN
OSVERSIONINFOA info;
OSVERSIONINFOW info;
ZeroMemory(&info, sizeof(info));
info.dwOSVersionInfoSize = sizeof(info);
GetVersionExA(&info);
GetVersionExW(&info);
return string::f("Windows %u.%u", info.dwMajorVersion, info.dwMinorVersion);
#endif
}


Loading…
Cancel
Save