271 tmp = GetLogicalDrives();
273 for (
int i = 0;
i < 26;
i++) {
274 if ((tmp >>
i) & 1) {
285 IShellFolder *desktop;
286 if (SHGetDesktopFolder(&desktop) == S_OK) {
287 PIDLIST_RELATIVE volume;
288 if (desktop->ParseDisplayName(
nullptr,
nullptr, wline,
nullptr, &volume,
nullptr) ==
292 volume_name.uType = STRRET_WSTR;
293 if (desktop->GetDisplayNameOf(volume, SHGDN_FORADDRESSBAR, &volume_name) == S_OK) {
294 wchar_t *volume_name_wchar;
295 if (StrRetToStrW(&volume_name, volume, &volume_name_wchar) == S_OK) {
298 CoTaskMemFree(volume_name_wchar);
301 CoTaskMemFree(volume);
306 if (
name ==
nullptr) {
310 int icon = ICON_DISK_DRIVE;
311 switch (GetDriveType(tmps)) {
312 case DRIVE_REMOVABLE:
313 icon = ICON_EXTERNAL_DRIVE;
320 icon = ICON_DISK_DRIVE;
323 icon = ICON_NETWORK_DRIVE;
333 if (read_bookmarks) {
336 fsmenu_add_windows_folder(fsmenu,
342 fsmenu_add_windows_folder(fsmenu,
348 fsmenu_add_windows_folder(fsmenu,
354 fsmenu_add_windows_folder(fsmenu,
360 fsmenu_add_windows_folder(fsmenu,
366 fsmenu_add_windows_folder(fsmenu,
372 fsmenu_add_windows_folder(fsmenu,
378 fsmenu_add_windows_folder(fsmenu,
384 fsmenu_add_windows_folder(fsmenu,
392 fsmenu_add_windows_folder(fsmenu,
394 FOLDERID_UserProfiles,
403#elif defined(__APPLE__)
418# define FS_MACOS_PATH(path, name, icon) \
420 SNPRINTF(line, path, home); \
422 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, line, name, icon, FS_INSERT_LAST);
424 FS_MACOS_PATH(
"%s/",
nullptr, ICON_HOME)
425 FS_MACOS_PATH(
"%s/Desktop/",
N_(
"Desktop"), ICON_DESKTOP)
426 FS_MACOS_PATH(
"%s/Documents/",
N_(
"Documents"), ICON_DOCUMENTS)
427 FS_MACOS_PATH(
"%s/Downloads/",
N_(
"Downloads"), ICON_IMPORT)
428 FS_MACOS_PATH(
"%s/Movies/",
N_(
"Movies"), ICON_FILE_MOVIE)
429 FS_MACOS_PATH(
"%s/Music/",
N_(
"Music"), ICON_FILE_SOUND)
430 FS_MACOS_PATH(
"%s/Pictures/",
N_(
"Pictures"), ICON_FILE_IMAGE)
431 FS_MACOS_PATH(
"%s/Library/Fonts/",
N_(
"Fonts"), ICON_FILE_FONT)
443 CFURLRef cfURL =
nullptr;
444 CFURLEnumeratorResult
result = kCFURLEnumeratorSuccess;
445 CFURLEnumeratorRef volEnum = CFURLEnumeratorCreateForMountedVolumes(
446 nullptr, kCFURLEnumeratorSkipInvisibles,
nullptr);
448 while (
result != kCFURLEnumeratorEnd) {
451 result = CFURLEnumeratorGetNextURL(volEnum, &cfURL,
nullptr);
452 if (
result != kCFURLEnumeratorSuccess) {
456 CFURLGetFileSystemRepresentation(cfURL,
false, (UInt8 *)defPath,
FILE_MAX);
460 CFStringRef nameString =
nullptr;
461 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeLocalizedNameKey, &nameString,
nullptr);
462 if (nameString !=
nullptr) {
463 CFStringGetCString(nameString, display_name,
sizeof(display_name), kCFStringEncodingUTF8);
464 CFRelease(nameString);
468 int icon = ICON_DISK_DRIVE;
469 CFBooleanRef localKey =
nullptr;
470 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeIsLocalKey, &localKey,
nullptr);
471 if (localKey !=
nullptr) {
472 if (!CFBooleanGetValue(localKey)) {
473 icon = ICON_NETWORK_DRIVE;
476 CFBooleanRef ejectableKey =
nullptr;
477 CFURLCopyResourcePropertyForKey(
478 cfURL, kCFURLVolumeIsEjectableKey, &ejectableKey,
nullptr);
479 if (ejectableKey !=
nullptr) {
480 if (CFBooleanGetValue(ejectableKey)) {
481 icon = ICON_EXTERNAL_DRIVE;
483 CFRelease(ejectableKey);
492 display_name[0] ? display_name :
nullptr,
501# pragma GCC diagnostic push
502# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
504 if (read_bookmarks) {
506 LSSharedFileListRef list = LSSharedFileListCreate(
507 nullptr, kLSSharedFileListFavoriteItems,
nullptr);
508 CFArrayRef pathesArray = LSSharedFileListCopySnapshot(list, &
seed);
509 CFIndex pathesCount = CFArrayGetCount(pathesArray);
511 for (CFIndex
i = 0;
i < pathesCount;
i++) {
512 LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(
515 CFURLRef cfURL =
nullptr;
516 OSErr err = LSSharedFileListItemResolve(itemRef,
517 kLSSharedFileListNoUserInteraction |
518 kLSSharedFileListDoNotMountVolumes,
521 if (err != noErr || !cfURL) {
525 CFStringRef pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle);
527 if (pathString ==
nullptr ||
528 !CFStringGetCString(pathString, line,
sizeof(line), kCFStringEncodingUTF8))
535 if (!strstr(line,
"myDocuments.cannedSearch") && (*line !=
'\0')) {
544 CFRelease(pathString);
548 CFRelease(pathesArray);
551# pragma GCC diagnostic pop
558 if (read_bookmarks && home) {
568 const char *default_path;
571 {
"XDG_DESKTOP_DIR",
"Desktop", ICON_DESKTOP},
572 {
"XDG_DOCUMENTS_DIR",
"Documents", ICON_DOCUMENTS},
573 {
"XDG_DOWNLOAD_DIR",
"Downloads", ICON_IMPORT},
574 {
"XDG_VIDEOS_DIR",
"Videos", ICON_FILE_MOVIE},
575 {
"XDG_PICTURES_DIR",
"Pictures", ICON_FILE_IMAGE},
576 {
"XDG_MUSIC_DIR",
"Music", ICON_FILE_SOUND},
581 xdg_map, fsmenu, xdg_items[
i].key, xdg_items[
i].default_path, xdg_items[
i].icon, home);
594 fp = setmntent(MOUNTED,
"r");
596 CLOG_WARN(&
LOG,
"Could not get a list of mounted file-systems");
603 auto strncmp_dir_delimit = [](
const char *a,
const char *
b,
size_t b_len) ->
int {
604 const int result = strncmp(a,
b, b_len);
607# define STRPREFIX_DIR_DELIMIT(a, b) (strncmp_dir_delimit((a), (b), strlen(b)) == 0)
609 while ((mnt = getmntent(fp))) {
610 if (STRPREFIX_DIR_DELIMIT(mnt->mnt_dir,
"/boot") ||
613 STRPREFIX_DIR_DELIMIT(mnt->mnt_dir,
"/efi"))
618 if (!STRPREFIX_DIR_DELIMIT(mnt->mnt_fsname,
"/dev")) {
622 if (
STRPREFIX(mnt->mnt_fsname,
"/dev/loop")) {
637# undef STRPREFIX_DIR_DELIMIT
639 if (endmntent(fp) == 0) {
640 CLOG_WARN(&
LOG,
"Could not close the list of mounted file-systems");
644 const char *
const xdg_runtime_dir =
BLI_getenv(
"XDG_RUNTIME_DIR");
645 if (xdg_runtime_dir !=
nullptr) {
648 BLI_path_join(filepath,
sizeof(filepath), xdg_runtime_dir,
"gvfs/");
652 for (
uint i = 0;
i < dirs_num;
i++) {
653 if ((dirs[
i].type & S_IFDIR) == 0) {
663 const char *label = strstr(
dirname,
"share=");
664 if (label !=
nullptr) {
666 const char *label_test = label + 6;
667 label = *label_test ? label_test :
dirname;
688#if defined(__APPLE__)
699#define FS_UDIR_PATH(dir, icon) \
700 if (dir[0] && !BLI_path_is_rel(dir)) { \
701 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, dir, nullptr, icon, FS_INSERT_LAST); \
707 if (
UNLIKELY(script_dir->dir_path[0] ==
'\0')) {
712 script_dir->dir_path,
static unsigned long seed