Added system path stuff on Windows
Fixed typo in image loading
This commit is contained in:
@@ -132,3 +132,78 @@ FS_List FS_PathList(M_Arena *arena, Str8 path) {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Str8 FS_SystemPath(M_Arena *arena, FS_SystemPathType path) {
|
||||
Str8 result = { 0 };
|
||||
|
||||
M_TempScope(1, &arena) {
|
||||
switch (path) {
|
||||
case FS_SYSTEM_PATH_EXE: {
|
||||
U64 offset = M_ArenaOffset(temp.arena);
|
||||
|
||||
DWORD err, nchars;
|
||||
|
||||
DWORD nSize = 1024;
|
||||
LPWSTR lpFilename = M_ArenaPush(temp.arena, WCHAR, .count = nSize, .flags = M_ARENA_NO_ZERO);
|
||||
|
||||
for (;;) {
|
||||
nchars = GetModuleFileNameW(0, lpFilename, nSize);
|
||||
|
||||
err = GetLastError();
|
||||
if (err != ERROR_INSUFFICIENT_BUFFER) {
|
||||
break;
|
||||
}
|
||||
|
||||
M_ArenaPop(temp.arena, offset);
|
||||
|
||||
nSize *= 2;
|
||||
lpFilename = M_ArenaPush(temp.arena, WCHAR, .count = nSize, .flags = M_ARENA_NO_ZERO);
|
||||
}
|
||||
|
||||
if (err == ERROR_SUCCESS) {
|
||||
while (lpFilename[nchars] != '\\') { nchars -= 1; }
|
||||
lpFilename[nchars] = 0;
|
||||
|
||||
result = Win32_MultiByteStr(arena, lpFilename);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case FS_SYSTEM_PATH_WORKING: {
|
||||
DWORD nSize = GetCurrentDirectoryW(0, 0);
|
||||
|
||||
if (nSize != 0) {
|
||||
LPWSTR lpBuffer = M_ArenaPush(temp.arena, WCHAR, .count = nSize, .flags = M_ARENA_NO_ZERO);
|
||||
GetCurrentDirectoryW(nSize, lpBuffer);
|
||||
|
||||
result = Win32_MultiByteStr(arena, lpBuffer);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case FS_SYSTEM_PATH_USER: {
|
||||
LPWSTR wpath;
|
||||
HRESULT hResult = SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, 0, &wpath);
|
||||
if (hResult == S_OK) {
|
||||
result = Win32_MultiByteStr(arena, wpath);
|
||||
CoTaskMemFree(wpath);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case FS_SYSTEM_PATH_TEMP: {
|
||||
DWORD nSize = MAX_PATH + 1;
|
||||
LPWSTR lpBuffer = M_ArenaPush(temp.arena, WCHAR, .count = nSize);
|
||||
|
||||
DWORD nchars = GetTempPathW(nSize, lpBuffer);
|
||||
if (nchars != 0) {
|
||||
lpBuffer[nchars - 1] = 0; // Strip trailing backslash
|
||||
result = Win32_MultiByteStr(arena, lpBuffer);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user