mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 23:16:14 +01:00
Add support for a number of special directories, as defined by the
2007-06-04 Matthias Clasen <mclasen@redhat.com> Add support for a number of special directories, as defined by the xdg-user-dirs specification. (#432651, Bastien Nocera, Emmanuele Bassi, Michael Natterer) * glib/glib.symbols: * glib/gutils.[hc]: Add the GUserDirectory enum and g_get_user_special_dir(), with implementations based on the xdg-user-dirs spec and on native interfaces for Win32 and Carbon. * configure.in: Add Carbon checks. * tests/tetsglib.c: Test g_get_user_special_dir(). svn path=/trunk/; revision=5528
This commit is contained in:
parent
c68dc0aef5
commit
d154485bc7
16
ChangeLog
16
ChangeLog
@ -1,3 +1,19 @@
|
|||||||
|
2007-06-04 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Add support for a number of special directories, as
|
||||||
|
defined by the xdg-user-dirs specification. (#432651,
|
||||||
|
Bastien Nocera, Emmanuele Bassi, Michael Natterer)
|
||||||
|
|
||||||
|
* glib/glib.symbols:
|
||||||
|
* glib/gutils.[hc]: Add the GUserDirectory enum and
|
||||||
|
g_get_user_special_dir(), with implementations based
|
||||||
|
on the xdg-user-dirs spec and on native interfaces
|
||||||
|
for Win32 and Carbon.
|
||||||
|
|
||||||
|
* configure.in: Add Carbon checks.
|
||||||
|
|
||||||
|
* tests/tetsglib.c: Test g_get_user_special_dir().
|
||||||
|
|
||||||
2007-06-03 Yevgen Muntyan <muntyan@tamu.edu>
|
2007-06-03 Yevgen Muntyan <muntyan@tamu.edu>
|
||||||
|
|
||||||
* glib/gregex.c: fixed g_regex_fetch_named* for cases when (?J)
|
* glib/gregex.c: fixed g_regex_fetch_named* for cases when (?J)
|
||||||
|
18
configure.in
18
configure.in
@ -145,11 +145,21 @@ case $host in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$glib_native_win32])
|
AC_MSG_RESULT([$glib_native_win32])
|
||||||
|
|
||||||
|
glib_have_carbon=no
|
||||||
|
AC_MSG_CHECKING([for Mac OS X Carbon support])
|
||||||
|
AC_TRY_CPP([
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#include <CoreServices/CoreServices.h>
|
||||||
|
], glib_have_carbon=yes)
|
||||||
|
|
||||||
|
AC_MSG_RESULT([$glib_have_carbon])
|
||||||
|
|
||||||
AM_CONDITIONAL(OS_WIN32, [test "$glib_native_win32" = "yes"])
|
AM_CONDITIONAL(OS_WIN32, [test "$glib_native_win32" = "yes"])
|
||||||
AM_CONDITIONAL(OS_UNIX, [test "$glib_native_win32" != "yes"])
|
AM_CONDITIONAL(OS_UNIX, [test "$glib_native_win32" != "yes"])
|
||||||
AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"])
|
AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"])
|
||||||
|
AM_CONDITIONAL(OS_CARBON, [test "$glib_have_carbon" = "yes"])
|
||||||
AC_SUBST(GLIB_DEF)
|
AC_SUBST(GLIB_DEF)
|
||||||
AC_SUBST(GMODULE_DEF)
|
AC_SUBST(GMODULE_DEF)
|
||||||
AC_SUBST(GOBJECT_DEF)
|
AC_SUBST(GOBJECT_DEF)
|
||||||
@ -180,6 +190,12 @@ else
|
|||||||
fi
|
fi
|
||||||
AC_SUBST(LIBTOOL_EXPORT_OPTIONS)
|
AC_SUBST(LIBTOOL_EXPORT_OPTIONS)
|
||||||
|
|
||||||
|
if test "x$glib_have_carbon" = "xyes"; then
|
||||||
|
AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available])
|
||||||
|
LDFLAGS="$LDFLAGS -framework Carbon"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
dnl declare --enable-* args and collect ac_help strings
|
dnl declare --enable-* args and collect ac_help strings
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
|
AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2007-06-04 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
* glib/glib-sections.txt:
|
||||||
|
* glib/tmpl/misc_utils.sgml: Add g_get_special_user_dir()
|
||||||
|
and GUserDirectory.
|
||||||
|
|
||||||
2007-05-30 Matthias Clasen <mclasen@redhat.com>
|
2007-05-30 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/tmpl/i18n.sgml: Add some hints about
|
* glib/tmpl/i18n.sgml: Add some hints about
|
||||||
|
@ -1388,6 +1388,8 @@ g_get_real_name
|
|||||||
g_get_user_cache_dir
|
g_get_user_cache_dir
|
||||||
g_get_user_data_dir
|
g_get_user_data_dir
|
||||||
g_get_user_config_dir
|
g_get_user_config_dir
|
||||||
|
GUserDirectory
|
||||||
|
g_get_user_special_dir
|
||||||
g_get_system_data_dirs
|
g_get_system_data_dirs
|
||||||
g_get_system_config_dirs
|
g_get_system_config_dirs
|
||||||
|
|
||||||
|
@ -125,6 +125,30 @@ These are portable utility functions.
|
|||||||
@Returns:
|
@Returns:
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ##### ENUM GUserDirectory ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@G_USER_DIRECTORY_DESKTOP:
|
||||||
|
@G_USER_DIRECTORY_DOCUMENTS:
|
||||||
|
@G_USER_DIRECTORY_DOWNLOAD:
|
||||||
|
@G_USER_DIRECTORY_MUSIC:
|
||||||
|
@G_USER_DIRECTORY_PICTURES:
|
||||||
|
@G_USER_DIRECTORY_PUBLIC_SHARE:
|
||||||
|
@G_USER_DIRECTORY_TEMPLATES:
|
||||||
|
@G_USER_DIRECTORY_VIDEOS:
|
||||||
|
@G_USER_N_DIRECTORIES:
|
||||||
|
|
||||||
|
<!-- ##### FUNCTION g_get_user_special_dir ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@directory:
|
||||||
|
@Returns:
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_get_system_data_dirs ##### -->
|
<!-- ##### FUNCTION g_get_system_data_dirs ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -1397,6 +1397,7 @@ g_get_tmp_dir_utf8
|
|||||||
g_get_user_cache_dir
|
g_get_user_cache_dir
|
||||||
g_get_user_config_dir
|
g_get_user_config_dir
|
||||||
g_get_user_data_dir
|
g_get_user_data_dir
|
||||||
|
g_get_user_special_dir
|
||||||
g_get_user_name PRIVATE
|
g_get_user_name PRIVATE
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
g_get_user_name_utf8
|
g_get_user_name_utf8
|
||||||
|
337
glib/gutils.c
337
glib/gutils.c
@ -40,6 +40,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h> /* For tolower() */
|
#include <ctype.h> /* For tolower() */
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#ifdef HAVE_PWD_H
|
#ifdef HAVE_PWD_H
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#endif
|
#endif
|
||||||
@ -100,6 +102,10 @@
|
|||||||
# include <process.h>
|
# include <process.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CARBON
|
||||||
|
#include <CoreServices/CoreServices.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CODESET
|
#ifdef HAVE_CODESET
|
||||||
#include <langinfo.h>
|
#include <langinfo.h>
|
||||||
#endif
|
#endif
|
||||||
@ -1387,6 +1393,13 @@ 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;
|
||||||
|
|
||||||
|
static gchar **g_user_special_dirs = NULL;
|
||||||
|
static time_t g_user_special_dirs_mtime = (time_t) -1;
|
||||||
|
static time_t g_user_special_dirs_stat_time = (time_t) -1;
|
||||||
|
|
||||||
|
/* fifteen minutes of fame for everybody */
|
||||||
|
#define G_USER_DIRS_EXPIRE 15 * 60
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
@ -2095,6 +2108,330 @@ g_get_user_cache_dir (void)
|
|||||||
return cache_dir;
|
return cache_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_CARBON
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
find_folder (OSType type)
|
||||||
|
{
|
||||||
|
gchar *filename = NULL;
|
||||||
|
FSRef found;
|
||||||
|
|
||||||
|
if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr)
|
||||||
|
{
|
||||||
|
CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found);
|
||||||
|
|
||||||
|
if (url)
|
||||||
|
{
|
||||||
|
CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle);
|
||||||
|
|
||||||
|
if (path)
|
||||||
|
{
|
||||||
|
filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8));
|
||||||
|
|
||||||
|
if (! filename)
|
||||||
|
{
|
||||||
|
filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1);
|
||||||
|
|
||||||
|
CFStringGetCString (path, filename,
|
||||||
|
CFStringGetLength (path) * 3 + 1,
|
||||||
|
kCFStringEncodingUTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease (path);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease (url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_user_special_dirs (void)
|
||||||
|
{
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL;
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL;
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_CARBON */
|
||||||
|
|
||||||
|
#if defined(G_OS_WIN32)
|
||||||
|
static void
|
||||||
|
load_user_special_dirs (void)
|
||||||
|
{
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_MYDOCUMENTS);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); /* XXX correct ? */
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); /* XXX correct ? */
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES);
|
||||||
|
g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO);
|
||||||
|
}
|
||||||
|
#endif /* G_OS_WIN32 */
|
||||||
|
|
||||||
|
#if defined(G_OS_WIN32) || defined(HAVE_CARBON)
|
||||||
|
static void
|
||||||
|
maybe_expire_user_special_dirs (void)
|
||||||
|
{
|
||||||
|
/* expire the user dirs after G_USER_DIRS_EXPIRE seconds */
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
time (&now);
|
||||||
|
if (now > g_user_special_dirs_mtime + G_USER_DIRS_EXPIRE &&
|
||||||
|
g_user_special_dirs)
|
||||||
|
{
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_USER_N_DIRECTORIES; i++)
|
||||||
|
g_free (g_user_special_dirs[i]);
|
||||||
|
|
||||||
|
g_free (g_user_special_dirs);
|
||||||
|
g_user_special_dirs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_user_special_dirs == NULL)
|
||||||
|
g_user_special_dirs_mtime = now;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(G_OS_UNIX) && !defined(HAVE_CARBON)
|
||||||
|
|
||||||
|
/* expire g_user_special_dirs if the config file
|
||||||
|
* was modified between different reads
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
maybe_expire_user_special_dirs (void)
|
||||||
|
{
|
||||||
|
gchar *config_file;
|
||||||
|
struct stat stat_buf;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
/* don't stat() the file more often than necessary */
|
||||||
|
time (&now);
|
||||||
|
if (now < g_user_special_dirs_stat_time + 5)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_user_special_dirs_stat_time = now;
|
||||||
|
|
||||||
|
config_file = g_build_filename (g_get_user_config_dir (),
|
||||||
|
"user-dirs.dirs",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (stat (config_file, &stat_buf) < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (stat_buf.st_mtime != g_user_special_dirs_mtime &&
|
||||||
|
g_user_special_dirs != NULL)
|
||||||
|
{
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_USER_N_DIRECTORIES; i++)
|
||||||
|
g_free (g_user_special_dirs[i]);
|
||||||
|
|
||||||
|
g_free (g_user_special_dirs);
|
||||||
|
g_user_special_dirs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_user_special_dirs_mtime = stat_buf.st_mtime;
|
||||||
|
|
||||||
|
out:
|
||||||
|
g_free (config_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adapted from xdg-user-dir-lookup.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation files
|
||||||
|
* (the "Software"), to deal in the Software without restriction,
|
||||||
|
* including without limitation the rights to use, copy, modify, merge,
|
||||||
|
* publish, distribute, sublicense, and/or sell copies of the Software,
|
||||||
|
* and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
/* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
load_user_special_dirs (void)
|
||||||
|
{
|
||||||
|
gchar *config_file;
|
||||||
|
gchar *data;
|
||||||
|
gchar **lines;
|
||||||
|
gint n_lines, i;
|
||||||
|
|
||||||
|
config_file = g_build_filename (g_get_user_config_dir (),
|
||||||
|
"user-dirs.dirs",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!g_file_get_contents (config_file, &data, NULL, NULL))
|
||||||
|
{
|
||||||
|
g_free (config_file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lines = g_strsplit (data, "\n", -1);
|
||||||
|
n_lines = g_strv_length (lines);
|
||||||
|
g_free (data);
|
||||||
|
|
||||||
|
for (i = 0; i < n_lines; i++)
|
||||||
|
{
|
||||||
|
gchar *buffer = lines[i];
|
||||||
|
gchar *d, *p;
|
||||||
|
gint len;
|
||||||
|
gboolean is_relative = FALSE;
|
||||||
|
GUserDirectory directory;
|
||||||
|
|
||||||
|
/* Remove newline at end */
|
||||||
|
len = strlen (buffer);
|
||||||
|
if (len > 0 && buffer[len - 1] == '\n')
|
||||||
|
buffer[len - 1] = 0;
|
||||||
|
|
||||||
|
p = buffer;
|
||||||
|
while (*p == ' ' || *p == '\t')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_DESKTOP;
|
||||||
|
p += strlen ("XDG_DESKTOP_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_DOCUMENTS;
|
||||||
|
p += strlen ("XDG_DOCUMENTS_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_DOWNLOAD;
|
||||||
|
p += strlen ("XDG_DOWNLOAD_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_MUSIC;
|
||||||
|
p += strlen ("XDG_MUSIC_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_PICTURES;
|
||||||
|
p += strlen ("XDG_PICTURES_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_PUBLIC_SHARE;
|
||||||
|
p += strlen ("XDG_PUBLICSHARE_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_TEMPLATES;
|
||||||
|
p += strlen ("XDG_TEMPLATES_DIR");
|
||||||
|
}
|
||||||
|
else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0)
|
||||||
|
{
|
||||||
|
directory = G_USER_DIRECTORY_VIDEOS;
|
||||||
|
p += strlen ("XDG_VIDEOS_DIR");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
|
||||||
|
while (*p == ' ' || *p == '\t')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (*p != '=')
|
||||||
|
continue;
|
||||||
|
p++;
|
||||||
|
|
||||||
|
while (*p == ' ' || *p == '\t')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (*p != '"')
|
||||||
|
continue;
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (strncmp (p, "$HOME", 5) == 0)
|
||||||
|
{
|
||||||
|
p += 5;
|
||||||
|
is_relative = TRUE;
|
||||||
|
}
|
||||||
|
else if (*p != '/')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
d = strrchr (p, '"');
|
||||||
|
if (!d)
|
||||||
|
continue;
|
||||||
|
*d = 0;
|
||||||
|
|
||||||
|
d = p;
|
||||||
|
|
||||||
|
/* remove trailing slashes */
|
||||||
|
len = strlen (d);
|
||||||
|
if (d[len - 1] == '/')
|
||||||
|
d[len - 1] = 0;
|
||||||
|
|
||||||
|
if (is_relative)
|
||||||
|
g_user_special_dirs[directory] = g_build_filename (g_get_home_dir (), d, NULL);
|
||||||
|
else
|
||||||
|
g_user_special_dirs[directory] = g_strdup (d);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (lines);
|
||||||
|
g_free (config_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* G_OS_UNIX && !HAVE_CARBON */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_get_user_special_dir:
|
||||||
|
* @directory: the logical id of special directory
|
||||||
|
*
|
||||||
|
* Returns the full path of a special directory using its logical id.
|
||||||
|
*
|
||||||
|
* On Unix this is done using the XDG special user directories.
|
||||||
|
*
|
||||||
|
* Return value: the path to the specified special directory, or %NULL
|
||||||
|
* if the logical id was not found. The returned string is owned by
|
||||||
|
* GLib and should not be modified or freed.
|
||||||
|
*
|
||||||
|
* Since: 2.14
|
||||||
|
*/
|
||||||
|
G_CONST_RETURN gchar *
|
||||||
|
g_get_user_special_dir (GUserDirectory directory)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP &&
|
||||||
|
directory < G_USER_N_DIRECTORIES, NULL);
|
||||||
|
|
||||||
|
G_LOCK (g_utils_global);
|
||||||
|
|
||||||
|
maybe_expire_user_special_dirs ();
|
||||||
|
if (g_user_special_dirs == NULL)
|
||||||
|
{
|
||||||
|
g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES);
|
||||||
|
load_user_special_dirs ();
|
||||||
|
}
|
||||||
|
|
||||||
|
G_UNLOCK (g_utils_global);
|
||||||
|
|
||||||
|
return g_user_special_dirs[directory];
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
|
||||||
#undef g_get_system_data_dirs
|
#undef g_get_system_data_dirs
|
||||||
|
@ -145,6 +145,43 @@ G_CONST_RETURN gchar* G_CONST_RETURN * g_get_system_config_dirs (void);
|
|||||||
|
|
||||||
G_CONST_RETURN gchar* G_CONST_RETURN * g_get_language_names (void);
|
G_CONST_RETURN gchar* G_CONST_RETURN * g_get_language_names (void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GUserDirectory:
|
||||||
|
*
|
||||||
|
* These are logical ids for special directories which are defined
|
||||||
|
* depending on the platform used. You should use g_get_user_special_dir()
|
||||||
|
* to retrieve the full path associated to the logical id.
|
||||||
|
*
|
||||||
|
* The #GUserDirectory enumeration can be extended at later date. Not
|
||||||
|
* every platform has a directory for every logical id in this
|
||||||
|
* enumeration.
|
||||||
|
*
|
||||||
|
* @G_USER_DIRECTORY_DESKTOP: the user's Desktop directory
|
||||||
|
* @G_USER_DIRECTORY_DOCUMENTS: the user's Documents directory
|
||||||
|
* @G_USER_DIRECTORY_DOWNLOAD: the user's Downloads directory
|
||||||
|
* @G_USER_DIRECTORY_MUSIC: the user's Music directory
|
||||||
|
* @G_USER_DIRECTORY_PICTURES: the user's Pictures directory
|
||||||
|
* @G_USER_DIRECTORY_PUBLIC_SHARE: the user's shared directory
|
||||||
|
* @G_USER_DIRECTORY_TEMPLATES: the user's Templates directory
|
||||||
|
* @G_USER_DIRECTORY_VIDEOS: the user's Movies directory
|
||||||
|
*
|
||||||
|
* Since: 2.14
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
G_USER_DIRECTORY_DESKTOP,
|
||||||
|
G_USER_DIRECTORY_DOCUMENTS,
|
||||||
|
G_USER_DIRECTORY_DOWNLOAD,
|
||||||
|
G_USER_DIRECTORY_MUSIC,
|
||||||
|
G_USER_DIRECTORY_PICTURES,
|
||||||
|
G_USER_DIRECTORY_PUBLIC_SHARE,
|
||||||
|
G_USER_DIRECTORY_TEMPLATES,
|
||||||
|
G_USER_DIRECTORY_VIDEOS,
|
||||||
|
|
||||||
|
G_USER_N_DIRECTORIES
|
||||||
|
} GUserDirectory;
|
||||||
|
|
||||||
|
G_CONST_RETURN gchar* g_get_user_special_dir (GUserDirectory directory);
|
||||||
|
|
||||||
typedef struct _GDebugKey GDebugKey;
|
typedef struct _GDebugKey GDebugKey;
|
||||||
struct _GDebugKey
|
struct _GDebugKey
|
||||||
{
|
{
|
||||||
|
@ -596,6 +596,14 @@ main (int argc,
|
|||||||
sv = (gchar **) g_get_language_names ();
|
sv = (gchar **) g_get_language_names ();
|
||||||
g_print ("languages: %s\n", s ? g_strjoinv (":", sv) : "NULL!");
|
g_print ("languages: %s\n", s ? g_strjoinv (":", sv) : "NULL!");
|
||||||
|
|
||||||
|
/* special dirs */
|
||||||
|
s = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP);
|
||||||
|
g_print ("user_special[DESKTOP]: %s\n", s ? s : "NULL!");
|
||||||
|
s = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
|
||||||
|
g_print ("user_special[DOCUMENTS]: %s\n", s ? s : "NULL!");
|
||||||
|
s = g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE);
|
||||||
|
g_print ("user_special[PUBLIC_SHARE]: %s\n", s ? s : "NULL!");
|
||||||
|
|
||||||
/* type sizes */
|
/* type sizes */
|
||||||
g_print ("checking size of gint8: %" G_GSIZE_FORMAT, sizeof (gint8));
|
g_print ("checking size of gint8: %" G_GSIZE_FORMAT, sizeof (gint8));
|
||||||
TEST (NULL, sizeof (gint8) == 1);
|
TEST (NULL, sizeof (gint8) == 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user