Win32 equivalences of the XDG folders

2004-08-25  Tor Lillqvist  <tml@iki.fi>

	Win32 equivalences of the XDG folders

	* glib/gutils.c (get_special_folder): New function, calls
	SHGetSpecialFolderLocation() to get path to places like the My
	Documents folder.
	(g_get_any_init): Use CSIDL_PROFILE as HOME if not
	overridden by env vars.
	(g_get_user_data_dir): Use CSIDL_PERSONAL.
	(g_get_user_config_dir): Use CSIDL_APPDATA.
	(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
	(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
	CSIDL_COMMON_DOCUMENTS.
	(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.

	* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.

	* glib/glib.def: Add the new functions.
This commit is contained in:
Tor Lillqvist 2004-08-25 00:39:13 +00:00 committed by Tor Lillqvist
parent d7bd1397a8
commit a56aee27f6
8 changed files with 186 additions and 19 deletions

View File

@ -1,3 +1,23 @@
2004-08-25 Tor Lillqvist <tml@iki.fi>
Win32 equivalences of the XDG folders
* glib/gutils.c (get_special_folder): New function, calls
SHGetSpecialFolderLocation() to get path to places like the My
Documents folder.
(g_get_any_init): Use CSIDL_PROFILE as HOME if not
overridden by env vars.
(g_get_user_data_dir): Use CSIDL_PERSONAL.
(g_get_user_config_dir): Use CSIDL_APPDATA.
(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
CSIDL_COMMON_DOCUMENTS.
(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
* glib/glib.def: Add the new functions.
Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org> Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
* glib/goption.c (g_option_group_add_entries): remove unused * glib/goption.c (g_option_group_add_entries): remove unused

View File

@ -1,3 +1,23 @@
2004-08-25 Tor Lillqvist <tml@iki.fi>
Win32 equivalences of the XDG folders
* glib/gutils.c (get_special_folder): New function, calls
SHGetSpecialFolderLocation() to get path to places like the My
Documents folder.
(g_get_any_init): Use CSIDL_PROFILE as HOME if not
overridden by env vars.
(g_get_user_data_dir): Use CSIDL_PERSONAL.
(g_get_user_config_dir): Use CSIDL_APPDATA.
(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
CSIDL_COMMON_DOCUMENTS.
(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
* glib/glib.def: Add the new functions.
Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org> Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
* glib/goption.c (g_option_group_add_entries): remove unused * glib/goption.c (g_option_group_add_entries): remove unused

View File

@ -1,3 +1,23 @@
2004-08-25 Tor Lillqvist <tml@iki.fi>
Win32 equivalences of the XDG folders
* glib/gutils.c (get_special_folder): New function, calls
SHGetSpecialFolderLocation() to get path to places like the My
Documents folder.
(g_get_any_init): Use CSIDL_PROFILE as HOME if not
overridden by env vars.
(g_get_user_data_dir): Use CSIDL_PERSONAL.
(g_get_user_config_dir): Use CSIDL_APPDATA.
(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
CSIDL_COMMON_DOCUMENTS.
(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
* glib/glib.def: Add the new functions.
Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org> Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
* glib/goption.c (g_option_group_add_entries): remove unused * glib/goption.c (g_option_group_add_entries): remove unused

View File

@ -1,3 +1,23 @@
2004-08-25 Tor Lillqvist <tml@iki.fi>
Win32 equivalences of the XDG folders
* glib/gutils.c (get_special_folder): New function, calls
SHGetSpecialFolderLocation() to get path to places like the My
Documents folder.
(g_get_any_init): Use CSIDL_PROFILE as HOME if not
overridden by env vars.
(g_get_user_data_dir): Use CSIDL_PERSONAL.
(g_get_user_config_dir): Use CSIDL_APPDATA.
(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
CSIDL_COMMON_DOCUMENTS.
(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
* glib/glib.def: Add the new functions.
Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org> Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
* glib/goption.c (g_option_group_add_entries): remove unused * glib/goption.c (g_option_group_add_entries): remove unused

View File

@ -1,3 +1,23 @@
2004-08-25 Tor Lillqvist <tml@iki.fi>
Win32 equivalences of the XDG folders
* glib/gutils.c (get_special_folder): New function, calls
SHGetSpecialFolderLocation() to get path to places like the My
Documents folder.
(g_get_any_init): Use CSIDL_PROFILE as HOME if not
overridden by env vars.
(g_get_user_data_dir): Use CSIDL_PERSONAL.
(g_get_user_config_dir): Use CSIDL_APPDATA.
(g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable...
(g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and
CSIDL_COMMON_DOCUMENTS.
(g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA.
* configure.in: Add -lole32 to G_LIBS_EXTRA for mingw.
* glib/glib.def: Add the new functions.
Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org> Mon Aug 23 16:16:35 2004 Manish Singh <yosh@gimp.org>
* glib/goption.c (g_option_group_add_entries): remove unused * glib/goption.c (g_option_group_add_entries): remove unused

View File

@ -1970,7 +1970,7 @@ case $host in
G_LIBS_EXTRA="-luser32 -lkernel32" G_LIBS_EXTRA="-luser32 -lkernel32"
;; ;;
*-*-mingw*) *-*-mingw*)
G_LIBS_EXTRA="-lwsock32" G_LIBS_EXTRA="-lwsock32 -lole32"
;; ;;
*) *)
G_LIBS_EXTRA="" G_LIBS_EXTRA=""

View File

@ -178,7 +178,12 @@ EXPORTS
g_get_home_dir g_get_home_dir
g_get_prgname g_get_prgname
g_get_real_name g_get_real_name
g_get_system_config_dirs
g_get_system_data_dirs
g_get_tmp_dir g_get_tmp_dir
g_get_user_cache_dir
g_get_user_config_dir
g_get_user_data_dir
g_get_user_name g_get_user_name
g_getenv g_getenv
g_hash_table_destroy g_hash_table_destroy

View File

@ -75,6 +75,7 @@
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
# include <direct.h> # include <direct.h>
# include <shlobj.h>
#endif #endif
#ifdef HAVE_CODESET #ifdef HAVE_CODESET
@ -892,6 +893,45 @@ static gchar *g_user_cache_dir = NULL;
static gchar *g_user_config_dir = NULL; static gchar *g_user_config_dir = NULL;
static gchar **g_system_config_dirs = NULL; static gchar **g_system_config_dirs = NULL;
#ifdef G_OS_WIN32
static gchar *
get_special_folder (int csidl)
{
union {
char c[MAX_PATH+1];
wchar_t wc[MAX_PATH+1];
} path;
HRESULT hr;
LPITEMIDLIST pidl = NULL;
BOOL b;
gchar *retval = NULL;
hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl);
if (hr == S_OK)
{
if (G_WIN32_HAVE_WIDECHAR_API ())
{
b = SHGetPathFromIDListW (pidl, path.wc);
if (b)
retval = g_utf16_to_utf8 (path.wc, -1, NULL, NULL, NULL);
}
else
{
b = SHGetPathFromIDListA (pidl, path.c);
if (b)
retval = g_locale_to_utf8 (path.c, -1, NULL, NULL, NULL);
}
CoTaskMemFree (pidl);
}
if (retval == NULL)
return "C:\\";
else
return retval;
}
#endif
/* HOLDS: g_utils_global_lock */ /* HOLDS: g_utils_global_lock */
static void static void
g_get_any_init (void) g_get_any_init (void)
@ -953,6 +993,9 @@ g_get_any_init (void)
g_home_dir = g_strdup (g_getenv ("USERPROFILE")); g_home_dir = g_strdup (g_getenv ("USERPROFILE"));
} }
if (!g_home_dir)
g_home_dir = get_special_folder (CSIDL_PROFILE);
if (!g_home_dir) if (!g_home_dir)
{ {
/* At least at some time, HOMEDRIVE and HOMEPATH were used /* At least at some time, HOMEDRIVE and HOMEPATH were used
@ -1269,6 +1312,9 @@ g_get_user_data_dir (void)
if (!g_user_data_dir) if (!g_user_data_dir)
{ {
#ifdef G_OS_WIN32
data_dir = get_special_folder (CSIDL_PERSONAL);
#else
data_dir = (gchar *) g_getenv ("XDG_DATA_HOME"); data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
if (data_dir && data_dir[0]) if (data_dir && data_dir[0])
@ -1281,7 +1327,7 @@ g_get_user_data_dir (void)
data_dir = g_build_filename (g_home_dir, ".local", data_dir = g_build_filename (g_home_dir, ".local",
"share", NULL); "share", NULL);
} }
#endif
g_user_data_dir = data_dir; g_user_data_dir = data_dir;
} }
else else
@ -1315,19 +1361,22 @@ g_get_user_config_dir (void)
if (!g_user_config_dir) if (!g_user_config_dir)
{ {
config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME"); #ifdef G_OS_WIN32
config_dir = get_special_folder (CSIDL_APPDATA);
if (config_dir && config_dir[0]) #else
config_dir = g_strdup (config_dir); config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
else
{ if (config_dir && config_dir[0])
if (!g_tmp_dir) config_dir = g_strdup (config_dir);
g_get_any_init (); else
{
config_dir = g_build_filename (g_home_dir, ".config", NULL); if (!g_tmp_dir)
} g_get_any_init ();
g_user_config_dir = config_dir; config_dir = g_build_filename (g_home_dir, ".config", NULL);
}
#endif
g_user_config_dir = config_dir;
} }
else else
config_dir = g_user_config_dir; config_dir = g_user_config_dir;
@ -1360,6 +1409,9 @@ g_get_user_cache_dir (void)
if (!g_user_cache_dir) if (!g_user_cache_dir)
{ {
#ifdef G_OS_WIN32
cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
#else
cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME"); cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
if (cache_dir && cache_dir[0]) if (cache_dir && cache_dir[0])
@ -1371,6 +1423,7 @@ g_get_user_cache_dir (void)
cache_dir = g_build_filename (g_home_dir, ".cache", NULL); cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
} }
#endif
g_user_cache_dir = cache_dir; g_user_cache_dir = cache_dir;
} }
else else
@ -1404,12 +1457,18 @@ g_get_system_data_dirs (void)
if (!g_system_data_dirs) if (!g_system_data_dirs)
{ {
#ifdef G_OS_WIN32
data_dirs = g_strconcat (get_special_folder (CSIDL_COMMON_APPDATA),
G_SEARCHPATH_SEPARATOR_S,
get_special_folder (CSIDL_COMMON_DOCUMENTS),
NULL);
#else
data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS"); data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS");
if (!data_dirs || !data_dirs[0]) if (!data_dirs || !data_dirs[0])
data_dirs = "/usr/local/share/:/usr/share/"; data_dirs = "/usr/local/share/:/usr/share/";
#endif
data_dir_vector = g_strsplit (data_dirs, ":", 0); data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
g_system_data_dirs = data_dir_vector; g_system_data_dirs = data_dir_vector;
} }
@ -1444,12 +1503,15 @@ g_get_system_config_dirs (void)
if (!g_system_config_dirs) if (!g_system_config_dirs)
{ {
#ifdef G_OS_WIN32
conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA);
#else
conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS"); conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS");
if (!conf_dirs || !conf_dirs[0]) if (!conf_dirs || !conf_dirs[0])
conf_dirs = "/etc/xdg"; conf_dirs = "/etc/xdg";
#endif
conf_dir_vector = g_strsplit (conf_dirs, ":", 0); conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
} }
else else
conf_dir_vector = g_system_config_dirs; conf_dir_vector = g_system_config_dirs;