251 tmp = GetLogicalDrives();
253 for (
int i = 0;
i < 26;
i++) {
254 if ((tmp >>
i) & 1) {
265 IShellFolder *desktop;
266 if (SHGetDesktopFolder(&desktop) == S_OK) {
267 PIDLIST_RELATIVE volume;
268 if (desktop->ParseDisplayName(
nullptr,
nullptr, wline,
nullptr, &volume,
nullptr) ==
272 volume_name.uType = STRRET_WSTR;
273 if (desktop->GetDisplayNameOf(volume, SHGDN_FORADDRESSBAR, &volume_name) == S_OK) {
274 wchar_t *volume_name_wchar;
275 if (StrRetToStrW(&volume_name, volume, &volume_name_wchar) == S_OK) {
278 CoTaskMemFree(volume_name_wchar);
281 CoTaskMemFree(volume);
286 if (name ==
nullptr) {
290 int icon = ICON_DISK_DRIVE;
291 switch (GetDriveType(tmps)) {
292 case DRIVE_REMOVABLE:
293 icon = ICON_EXTERNAL_DRIVE;
300 icon = ICON_DISK_DRIVE;
303 icon = ICON_NETWORK_DRIVE;
317 if (read_bookmarks) {
320 fsmenu_add_windows_folder(fsmenu,
326 fsmenu_add_windows_folder(fsmenu,
332 fsmenu_add_windows_folder(fsmenu,
338 fsmenu_add_windows_folder(fsmenu,
344 fsmenu_add_windows_folder(fsmenu,
350 fsmenu_add_windows_folder(fsmenu,
356 fsmenu_add_windows_folder(fsmenu,
362 fsmenu_add_windows_folder(fsmenu,
368 fsmenu_add_windows_folder(fsmenu,
376 fsmenu_add_windows_folder(fsmenu,
378 FOLDERID_UserProfiles,
387#elif defined(__APPLE__)
402# define FS_MACOS_PATH(path, name, icon) \
404 SNPRINTF(line, path, home); \
406 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, line, name, icon, FS_INSERT_LAST);
408 FS_MACOS_PATH(
"%s/",
nullptr, ICON_HOME)
409 FS_MACOS_PATH(
"%s/Desktop/",
N_(
"Desktop"), ICON_DESKTOP)
410 FS_MACOS_PATH(
"%s/Documents/",
N_(
"Documents"), ICON_DOCUMENTS)
411 FS_MACOS_PATH(
"%s/Downloads/",
N_(
"Downloads"), ICON_IMPORT)
412 FS_MACOS_PATH(
"%s/Movies/",
N_(
"Movies"), ICON_FILE_MOVIE)
413 FS_MACOS_PATH(
"%s/Music/",
N_(
"Music"), ICON_FILE_SOUND)
414 FS_MACOS_PATH(
"%s/Pictures/",
N_(
"Pictures"), ICON_FILE_IMAGE)
415 FS_MACOS_PATH(
"%s/Library/Fonts/",
N_(
"Fonts"), ICON_FILE_FONT)
427 CFURLRef cfURL =
nullptr;
428 CFURLEnumeratorResult
result = kCFURLEnumeratorSuccess;
429 CFURLEnumeratorRef volEnum = CFURLEnumeratorCreateForMountedVolumes(
430 nullptr, kCFURLEnumeratorSkipInvisibles,
nullptr);
432 while (
result != kCFURLEnumeratorEnd) {
435 result = CFURLEnumeratorGetNextURL(volEnum, &cfURL,
nullptr);
436 if (
result != kCFURLEnumeratorSuccess) {
440 CFURLGetFileSystemRepresentation(cfURL,
false, (UInt8 *)defPath,
FILE_MAX);
444 CFStringRef nameString =
nullptr;
445 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeLocalizedNameKey, &nameString,
nullptr);
446 if (nameString !=
nullptr) {
447 CFStringGetCString(nameString, display_name,
sizeof(display_name), kCFStringEncodingUTF8);
448 CFRelease(nameString);
452 int icon = ICON_DISK_DRIVE;
453 CFBooleanRef localKey =
nullptr;
454 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeIsLocalKey, &localKey,
nullptr);
455 if (localKey !=
nullptr) {
456 if (!CFBooleanGetValue(localKey)) {
457 icon = ICON_NETWORK_DRIVE;
460 CFBooleanRef ejectableKey =
nullptr;
461 CFURLCopyResourcePropertyForKey(
462 cfURL, kCFURLVolumeIsEjectableKey, &ejectableKey,
nullptr);
463 if (ejectableKey !=
nullptr) {
464 if (CFBooleanGetValue(ejectableKey)) {
465 icon = ICON_EXTERNAL_DRIVE;
467 CFRelease(ejectableKey);
476 display_name[0] ? display_name :
nullptr,
485# pragma GCC diagnostic push
486# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
488 if (read_bookmarks) {
490 LSSharedFileListRef list = LSSharedFileListCreate(
491 nullptr, kLSSharedFileListFavoriteItems,
nullptr);
492 CFArrayRef pathesArray = LSSharedFileListCopySnapshot(list, &
seed);
493 CFIndex pathesCount = CFArrayGetCount(pathesArray);
495 for (CFIndex
i = 0;
i < pathesCount;
i++) {
496 LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(
499 CFURLRef cfURL =
nullptr;
500 OSErr err = LSSharedFileListItemResolve(itemRef,
501 kLSSharedFileListNoUserInteraction |
502 kLSSharedFileListDoNotMountVolumes,
505 if (err != noErr || !cfURL) {
509 CFStringRef pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle);
511 if (pathString ==
nullptr ||
512 !CFStringGetCString(pathString, line,
sizeof(line), kCFStringEncodingUTF8))
519 if (!strstr(line,
"myDocuments.cannedSearch") && (*line !=
'\0')) {
528 CFRelease(pathString);
532 CFRelease(pathesArray);
535# pragma GCC diagnostic pop
542 if (read_bookmarks && home) {
552 const char *default_path;
555 {
"XDG_DESKTOP_DIR",
"Desktop", ICON_DESKTOP},
556 {
"XDG_DOCUMENTS_DIR",
"Documents", ICON_DOCUMENTS},
557 {
"XDG_DOWNLOAD_DIR",
"Downloads", ICON_IMPORT},
558 {
"XDG_VIDEOS_DIR",
"Videos", ICON_FILE_MOVIE},
559 {
"XDG_PICTURES_DIR",
"Pictures", ICON_FILE_IMAGE},
560 {
"XDG_MUSIC_DIR",
"Music", ICON_FILE_SOUND},
565 xdg_map, fsmenu, xdg_items[
i].key, xdg_items[
i].default_path, xdg_items[
i].icon, home);
578 fp = setmntent(MOUNTED,
"r");
580 fprintf(stderr,
"could not get a list of mounted file-systems\n");
587 auto strncmp_dir_delimit = [](
const char *a,
const char *
b,
size_t b_len) ->
int {
588 const int result = strncmp(a,
b, b_len);
591# define STRPREFIX_DIR_DELIMIT(a, b) (strncmp_dir_delimit((a), (b), strlen(b)) == 0)
593 while ((mnt = getmntent(fp))) {
594 if (STRPREFIX_DIR_DELIMIT(mnt->mnt_dir,
"/boot") ||
597 STRPREFIX_DIR_DELIMIT(mnt->mnt_dir,
"/efi"))
602 if (!STRPREFIX_DIR_DELIMIT(mnt->mnt_fsname,
"/dev")) {
606 if (
STRPREFIX(mnt->mnt_fsname,
"/dev/loop")) {
621# undef STRPREFIX_DIR_DELIMIT
623 if (endmntent(fp) == 0) {
624 fprintf(stderr,
"could not close the list of mounted file-systems\n");
628 const char *
const xdg_runtime_dir =
BLI_getenv(
"XDG_RUNTIME_DIR");
629 if (xdg_runtime_dir !=
nullptr) {
632 BLI_path_join(filepath,
sizeof(filepath), xdg_runtime_dir,
"gvfs/");
636 for (
uint i = 0;
i < dirs_num;
i++) {
637 if ((dirs[
i].type & S_IFDIR) == 0) {
647 const char *label = strstr(
dirname,
"share=");
648 if (label !=
nullptr) {
650 const char *label_test = label + 6;
651 label = *label_test ? label_test :
dirname;
672#if defined(__APPLE__)
683#define FS_UDIR_PATH(dir, icon) \
684 if (dir[0] && !BLI_path_is_rel(dir)) { \
685 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, dir, nullptr, icon, FS_INSERT_LAST); \
691 if (
UNLIKELY(script_dir->dir_path[0] ==
'\0')) {
696 script_dir->dir_path,
static unsigned long seed