Reading the config directory from the Windows API instead of GLib
Before we used g_get_user_config_dir() but GLib changed the returned location in newer versions, so use the Windows API directly to get the old location, at least for now. Also add utils_get_user_config_dir() wrapper. Code is based almost completely on a patch from Matthew.
This commit is contained in:
parent
f262f5986d
commit
3e089e4c2c
@ -608,7 +608,7 @@ static void parse_command_line_options(gint *argc, gchar ***argv)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app->configdir = g_build_filename(g_get_user_config_dir(), "geany", NULL);
|
app->configdir = utils_get_user_config_dir();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (generate_tags)
|
if (generate_tags)
|
||||||
|
10
src/utils.c
10
src/utils.c
@ -2078,3 +2078,13 @@ gchar *utils_parse_and_format_build_date(const gchar *input)
|
|||||||
|
|
||||||
return g_strdup(input);
|
return g_strdup(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gchar *utils_get_user_config_dir(void)
|
||||||
|
{
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
return win32_get_user_config_dir();
|
||||||
|
#else
|
||||||
|
return g_build_filename(g_get_user_data_dir(), "geany", NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@ -289,6 +289,8 @@ GDate *utils_parse_date(const gchar *input);
|
|||||||
|
|
||||||
gchar *utils_parse_and_format_build_date(const gchar *input);
|
gchar *utils_parse_and_format_build_date(const gchar *input);
|
||||||
|
|
||||||
|
gchar *utils_get_user_config_dir(void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* GEANY_UTILS_H */
|
#endif /* GEANY_UTILS_H */
|
||||||
|
27
src/win32.c
27
src/win32.c
@ -1497,4 +1497,31 @@ gchar *win32_get_installation_dir(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gchar *win32_get_user_config_dir(void)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
wchar_t path[MAX_PATH];
|
||||||
|
LPSTR w_title[512];
|
||||||
|
|
||||||
|
hr = SHGetFolderPathAndSubDirW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, L"geany", path);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
// GLib always uses UTF-8 for filename encoding on Windows
|
||||||
|
int u8_size = WideCharToMultiByte(CP_UTF8, 0, path, -1, NULL, 0, NULL, NULL);
|
||||||
|
if (u8_size > 0)
|
||||||
|
{
|
||||||
|
gchar *u8_path = g_malloc0(u8_size + 1);
|
||||||
|
if (u8_path != NULL &&
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, path, -1, u8_path, u8_size, NULL, NULL))
|
||||||
|
{
|
||||||
|
return u8_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// glib fallback
|
||||||
|
g_warning("Failed to retrieve Windows config dir, falling back to default");
|
||||||
|
return g_build_filename(g_get_user_config_dir(), "geany", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -71,6 +71,8 @@ gchar *win32_get_installation_dir(void);
|
|||||||
|
|
||||||
gchar *win32_expand_environment_variables(const gchar *str);
|
gchar *win32_expand_environment_variables(const gchar *str);
|
||||||
|
|
||||||
|
gchar *win32_get_user_config_dir(void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* G_OS_WIN32 */
|
#endif /* G_OS_WIN32 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user