diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-11-01 05:15:10 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-11-01 05:15:10 +0300 |
commit | e2937ff24fc833d64f1aa94b07079ad168e300ce (patch) | |
tree | 3d509ed5b0259276baa8838663eed0b6059104d0 /source | |
parent | c312c7196944b095fbd1b74c085a3af1e64409ce (diff) | |
parent | a0633e2484f21c9f80842c10b46b3af98b54d25a (diff) |
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_appdir.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/appdir.c | 20 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_winstuff.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/path_util.c | 9 | ||||
-rw-r--r-- | source/blender/blenlib/intern/winstuff.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_file/file_ops.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_file/fsmenu.c | 19 |
7 files changed, 49 insertions, 15 deletions
diff --git a/source/blender/blenkernel/BKE_appdir.h b/source/blender/blenkernel/BKE_appdir.h index 07132201e87..65485058dd7 100644 --- a/source/blender/blenkernel/BKE_appdir.h +++ b/source/blender/blenkernel/BKE_appdir.h @@ -21,6 +21,8 @@ #include <stddef.h> +#include "BLI_compiler_attrs.h" + #ifdef __cplusplus extern "C" { #endif @@ -32,7 +34,9 @@ void BKE_appdir_exit(void); /* note on naming: typical _get() suffix is omitted here, * since its the main purpose of the API. */ -const char *BKE_appdir_folder_default(void); +const char *BKE_appdir_folder_default(void) ATTR_WARN_UNUSED_RESULT; +const char *BKE_appdir_folder_root(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; +const char *BKE_appdir_folder_default_or_root(void) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL; const char *BKE_appdir_folder_home(void); bool BKE_appdir_folder_documents(char *dir); bool BKE_appdir_folder_caches(char *r_path, size_t path_len); diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c index fb6656a4b1c..a43b708db52 100644 --- a/source/blender/blenkernel/intern/appdir.c +++ b/source/blender/blenkernel/intern/appdir.c @@ -170,6 +170,26 @@ const char *BKE_appdir_folder_default(void) #endif /* WIN32 */ } +const char *BKE_appdir_folder_root(void) +{ +#ifndef WIN32 + return "/"; +#else + static char root[4]; + BLI_windows_get_default_root_dir(root); + return root; +#endif +} + +const char *BKE_appdir_folder_default_or_root(void) +{ + const char *path = BKE_appdir_folder_default(); + if (path == NULL) { + path = BKE_appdir_folder_root(); + } + return path; +} + /** * Get the user's home directory, i.e. * - Unix: `$HOME` diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h index bf09b56c779..cbf1716602a 100644 --- a/source/blender/blenlib/BLI_winstuff.h +++ b/source/blender/blenlib/BLI_winstuff.h @@ -106,7 +106,7 @@ const char *dirname(char *path); /* Windows utility functions. */ bool BLI_windows_register_blend_extension(const bool background); -void BLI_windows_get_default_root_dir(char *root_dir); +void BLI_windows_get_default_root_dir(char root_dir[4]); int BLI_windows_get_executable_dir(char *str); #ifdef __cplusplus diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 2403d34e5d7..182fe211110 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1730,6 +1730,9 @@ void BLI_path_append(char *__restrict dst, const size_t maxlen, const char *__re /** * Simple appending of filename to dir, does not check for valid path! * Puts result into `dst`, which may be same area as `dir`. + * + * \note Consider using #BLI_path_join for more general path joining + * that de-duplicates separators and can handle an arbitrary number of paths. */ void BLI_join_dirfile(char *__restrict dst, const size_t maxlen, @@ -1741,9 +1744,13 @@ void BLI_join_dirfile(char *__restrict dst, #endif size_t dirlen = BLI_strnlen(dir, maxlen); - /* args can't match */ + /* Arguments can't match. */ BLI_assert(!ELEM(dst, dir, file)); + /* Files starting with a separator cause a double-slash which could later be interpreted + * as a relative path where: `dir == "/"` and `file == "/file"` would result in "//file". */ + BLI_assert(file[0] != SEP); + if (dirlen == maxlen) { memcpy(dst, dir, dirlen); dst[dirlen - 1] = '\0'; diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c index 3001b25bc1e..11345fc7242 100644 --- a/source/blender/blenlib/intern/winstuff.c +++ b/source/blender/blenlib/intern/winstuff.c @@ -193,7 +193,7 @@ bool BLI_windows_register_blend_extension(const bool background) return true; } -void BLI_windows_get_default_root_dir(char *root) +void BLI_windows_get_default_root_dir(char root[4]) { char str[MAX_PATH + 1]; diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 4eb10e65867..844514759f3 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -2491,12 +2491,14 @@ static void file_expand_directory(bContext *C) if (BLI_path_is_rel(params->dir)) { /* Use of 'default' folder here is just to avoid an error message on '//' prefix. */ BLI_path_abs(params->dir, - G.relbase_valid ? BKE_main_blendfile_path(bmain) : BKE_appdir_folder_default()); + G.relbase_valid ? BKE_main_blendfile_path(bmain) : + BKE_appdir_folder_default_or_root()); } else if (params->dir[0] == '~') { char tmpstr[sizeof(params->dir) - 1]; BLI_strncpy(tmpstr, params->dir + 1, sizeof(tmpstr)); - BLI_join_dirfile(params->dir, sizeof(params->dir), BKE_appdir_folder_default(), tmpstr); + BLI_path_join( + params->dir, sizeof(params->dir), BKE_appdir_folder_default_or_root(), tmpstr, NULL); } else if (params->dir[0] == '\0') diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index 091c2d5f434..97f22ca7d89 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -769,21 +769,22 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks) FS_INSERT_LAST); const char *home = BLI_getenv("HOME"); - + if (home) { # define FS_MACOS_PATH(path, name, icon) \ BLI_snprintf(line, sizeof(line), path, home); \ fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, line, name, icon, FS_INSERT_LAST); - FS_MACOS_PATH("%s/", NULL, ICON_HOME) - FS_MACOS_PATH("%s/Desktop/", N_("Desktop"), ICON_DESKTOP) - FS_MACOS_PATH("%s/Documents/", N_("Documents"), ICON_DOCUMENTS) - FS_MACOS_PATH("%s/Downloads/", N_("Downloads"), ICON_IMPORT) - FS_MACOS_PATH("%s/Movies/", N_("Movies"), ICON_FILE_MOVIE) - FS_MACOS_PATH("%s/Music/", N_("Music"), ICON_FILE_SOUND) - FS_MACOS_PATH("%s/Pictures/", N_("Pictures"), ICON_FILE_IMAGE) - FS_MACOS_PATH("%s/Library/Fonts/", N_("Fonts"), ICON_FILE_FONT) + FS_MACOS_PATH("%s/", NULL, ICON_HOME) + FS_MACOS_PATH("%s/Desktop/", N_("Desktop"), ICON_DESKTOP) + FS_MACOS_PATH("%s/Documents/", N_("Documents"), ICON_DOCUMENTS) + FS_MACOS_PATH("%s/Downloads/", N_("Downloads"), ICON_IMPORT) + FS_MACOS_PATH("%s/Movies/", N_("Movies"), ICON_FILE_MOVIE) + FS_MACOS_PATH("%s/Music/", N_("Music"), ICON_FILE_SOUND) + FS_MACOS_PATH("%s/Pictures/", N_("Pictures"), ICON_FILE_IMAGE) + FS_MACOS_PATH("%s/Library/Fonts/", N_("Fonts"), ICON_FILE_FONT) # undef FS_MACOS_PATH + } /* Get mounted volumes better method OSX 10.6 and higher, see: * https://developer.apple.com/library/mac/#documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html |