Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-11-01 05:15:10 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-11-01 05:15:10 +0300
commite2937ff24fc833d64f1aa94b07079ad168e300ce (patch)
tree3d509ed5b0259276baa8838663eed0b6059104d0 /source
parentc312c7196944b095fbd1b74c085a3af1e64409ce (diff)
parenta0633e2484f21c9f80842c10b46b3af98b54d25a (diff)
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_appdir.h6
-rw-r--r--source/blender/blenkernel/intern/appdir.c20
-rw-r--r--source/blender/blenlib/BLI_winstuff.h2
-rw-r--r--source/blender/blenlib/intern/path_util.c9
-rw-r--r--source/blender/blenlib/intern/winstuff.c2
-rw-r--r--source/blender/editors/space_file/file_ops.c6
-rw-r--r--source/blender/editors/space_file/fsmenu.c19
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