diff --git a/CHANGELOG.md b/CHANGELOG.md index 06ec714e3..7b3866154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Features: * `--logo-padding-top` option (@CarterLi, #372) * Raw image file as logo support (@CarterLi) +* Look for config files in $LOCALAPPDATA (Windows) (@CarterLi) Logos: * Raspbian (@IamNoRobot, #373) diff --git a/src/common/init.c b/src/common/init.c index 6bd70680b..8522c0cd9 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -12,6 +12,8 @@ #ifdef _WIN32 #include #include + #include + #include "util/windows/unicode.h" #else #include #endif @@ -20,7 +22,22 @@ static void initConfigDirs(FFstate* state) { ffListInit(&state->configDirs, sizeof(FFstrbuf)); - #if !(defined(_WIN32) || defined(__APPLE__) || defined(__ANDROID__)) + #ifdef _WIN32 + + { + PWSTR pPath; + if(SUCCEEDED(SHGetKnownFolderPath(&FOLDERID_LocalAppData, 0, NULL, &pPath))) + { + FFstrbuf* buffer = (FFstrbuf*) ffListAdd(&state->configDirs); + ffStrbufInit(buffer); + ffStrbufSetWS(buffer, pPath); + ffStrbufReplaceAllC(buffer, '\\', '/'); + ffStrbufEnsureEndsWithC(buffer, '/'); + } + CoTaskMemFree(pPath); + } + + #elif !(defined(__APPLE__) || defined(__ANDROID__)) const char* xdgConfigHome = getenv("XDG_CONFIG_HOME"); if(ffStrSet(xdgConfigHome)) diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index 27150ef24..94f436d51 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -328,6 +328,12 @@ uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c) return strbuf->length; } +void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace) +{ + for (char *current_pos = strchr(strbuf->chars, find); current_pos; current_pos = strchr(current_pos + 1, find)) + *current_pos = replace; +} + void ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index) { if(strbuf->length <= index) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index 22133a7ea..94adc6b03 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -69,6 +69,8 @@ FF_C_NODISCARD uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t star FF_C_NODISCARD uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c); +void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace); + void ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index); void ffStrbufSubstrBeforeFirstC(FFstrbuf* strbuf, char c); void ffStrbufSubstrBeforeLastC(FFstrbuf* strbuf, char c); diff --git a/src/util/windows/pwd.c b/src/util/windows/pwd.c index a52f2689a..ce37aabc7 100644 --- a/src/util/windows/pwd.c +++ b/src/util/windows/pwd.c @@ -11,7 +11,12 @@ struct passwd* ffGetPasswd() DWORD len = sizeof(res.pw_name); GetUserNameA(res.pw_name, &len); - SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, res.pw_dir); + PWSTR pPath; + if(SUCCEEDED(SHGetKnownFolderPath(&FOLDERID_Profile, KF_FLAG_DEFAULT, NULL, &pPath))) + WideCharToMultiByte(CP_UTF8, 0, pPath, -1, res.pw_dir, sizeof(res.pw_dir), NULL, NULL); //res has been NULL inited + CoTaskMemFree(pPath); + for (char *current_pos = strchr(res.pw_dir, '\\'); current_pos; current_pos = strchr(current_pos + 1, '\\')) + *current_pos = '/'; return &res; } diff --git a/tests/strbuf.c b/tests/strbuf.c index 3b55142ec..3d8d3d057 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -208,6 +208,12 @@ int main(void) VERIFY(ffStrbufContainC(&strbuf, '1')); VERIFY(!ffStrbufContainC(&strbuf, '-')); + //replaceAllC + ffStrbufReplaceAllC(&strbuf, '1', '-'); + VERIFY(ffStrbufEqualS(&strbuf, "-234567890-234567890-234567890-")); + ffStrbufReplaceAllC(&strbuf, '1', '-'); + VERIFY(ffStrbufEqualS(&strbuf, "-234567890-234567890-234567890-")); + ffStrbufDestroy(&strbuf); //Success