252 tmp = GetLogicalDrives();
254 for (
int i = 0; i < 26; i++) {
255 if ((tmp >> i) & 1) {
266 IShellFolder *desktop;
267 if (SHGetDesktopFolder(&desktop) == S_OK) {
268 PIDLIST_RELATIVE volume;
269 if (desktop->ParseDisplayName(
nullptr,
nullptr, wline,
nullptr, &volume,
nullptr) ==
273 volume_name.uType = STRRET_WSTR;
274 if (desktop->GetDisplayNameOf(volume, SHGDN_FORADDRESSBAR, &volume_name) == S_OK) {
275 wchar_t *volume_name_wchar;
276 if (StrRetToStrW(&volume_name, volume, &volume_name_wchar) == S_OK) {
279 CoTaskMemFree(volume_name_wchar);
282 CoTaskMemFree(volume);
287 if (name ==
nullptr) {
291 int icon = ICON_DISK_DRIVE;
292 switch (GetDriveType(tmps)) {
293 case DRIVE_REMOVABLE:
294 icon = ICON_EXTERNAL_DRIVE;
301 icon = ICON_DISK_DRIVE;
304 icon = ICON_NETWORK_DRIVE;
318 if (read_bookmarks) {
321 fsmenu_add_windows_folder(fsmenu,
327 fsmenu_add_windows_folder(fsmenu,
333 fsmenu_add_windows_folder(fsmenu,
339 fsmenu_add_windows_folder(fsmenu,
345 fsmenu_add_windows_folder(fsmenu,
351 fsmenu_add_windows_folder(fsmenu,
357 fsmenu_add_windows_folder(fsmenu,
363 fsmenu_add_windows_folder(fsmenu,
369 fsmenu_add_windows_folder(fsmenu,
377 fsmenu_add_windows_folder(fsmenu,
379 FOLDERID_UserProfiles,
388#elif defined(__APPLE__)
403# define FS_MACOS_PATH(path, name, icon) \
405 SNPRINTF(line, path, home); \
407 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, line, name, icon, FS_INSERT_LAST);
409 FS_MACOS_PATH(
"%s/",
nullptr, ICON_HOME)
410 FS_MACOS_PATH(
"%s/Desktop/",
N_(
"Desktop"), ICON_DESKTOP)
411 FS_MACOS_PATH(
"%s/Documents/",
N_(
"Documents"), ICON_DOCUMENTS)
412 FS_MACOS_PATH(
"%s/Downloads/",
N_(
"Downloads"), ICON_IMPORT)
413 FS_MACOS_PATH(
"%s/Movies/",
N_(
"Movies"), ICON_FILE_MOVIE)
414 FS_MACOS_PATH(
"%s/Music/",
N_(
"Music"), ICON_FILE_SOUND)
415 FS_MACOS_PATH(
"%s/Pictures/",
N_(
"Pictures"), ICON_FILE_IMAGE)
416 FS_MACOS_PATH(
"%s/Library/Fonts/",
N_(
"Fonts"), ICON_FILE_FONT)
428 CFURLRef cfURL =
nullptr;
429 CFURLEnumeratorResult result = kCFURLEnumeratorSuccess;
430 CFURLEnumeratorRef volEnum = CFURLEnumeratorCreateForMountedVolumes(
431 nullptr, kCFURLEnumeratorSkipInvisibles,
nullptr);
433 while (result != kCFURLEnumeratorEnd) {
436 result = CFURLEnumeratorGetNextURL(volEnum, &cfURL,
nullptr);
437 if (result != kCFURLEnumeratorSuccess) {
441 CFURLGetFileSystemRepresentation(cfURL,
false, (UInt8 *)defPath,
FILE_MAX);
445 CFStringRef nameString =
nullptr;
446 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeLocalizedNameKey, &nameString,
nullptr);
447 if (nameString !=
nullptr) {
448 CFStringGetCString(nameString, display_name,
sizeof(display_name), kCFStringEncodingUTF8);
449 CFRelease(nameString);
453 int icon = ICON_DISK_DRIVE;
454 CFBooleanRef localKey =
nullptr;
455 CFURLCopyResourcePropertyForKey(cfURL, kCFURLVolumeIsLocalKey, &localKey,
nullptr);
456 if (localKey !=
nullptr) {
457 if (!CFBooleanGetValue(localKey)) {
458 icon = ICON_NETWORK_DRIVE;
461 CFBooleanRef ejectableKey =
nullptr;
462 CFURLCopyResourcePropertyForKey(
463 cfURL, kCFURLVolumeIsEjectableKey, &ejectableKey,
nullptr);
464 if (ejectableKey !=
nullptr) {
465 if (CFBooleanGetValue(ejectableKey)) {
466 icon = ICON_EXTERNAL_DRIVE;
468 CFRelease(ejectableKey);
477 display_name[0] ? display_name :
nullptr,
486# pragma GCC diagnostic push
487# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
489 if (read_bookmarks) {
491 LSSharedFileListRef list = LSSharedFileListCreate(
492 nullptr, kLSSharedFileListFavoriteItems,
nullptr);
493 CFArrayRef pathesArray = LSSharedFileListCopySnapshot(list, &
seed);
494 CFIndex pathesCount = CFArrayGetCount(pathesArray);
496 for (CFIndex i = 0; i < pathesCount; i++) {
497 LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(
500 CFURLRef cfURL =
nullptr;
501 OSErr err = LSSharedFileListItemResolve(itemRef,
502 kLSSharedFileListNoUserInteraction |
503 kLSSharedFileListDoNotMountVolumes,
506 if (err != noErr || !cfURL) {
510 CFStringRef pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle);
512 if (pathString ==
nullptr ||
513 !CFStringGetCString(pathString, line,
sizeof(line), kCFStringEncodingUTF8))
520 if (!strstr(line,
"myDocuments.cannedSearch") && (*line !=
'\0')) {
529 CFRelease(pathString);
533 CFRelease(pathesArray);
536# pragma GCC diagnostic pop
543 if (read_bookmarks && home) {
553 const char *default_path;
556 {
"XDG_DESKTOP_DIR",
"Desktop", ICON_DESKTOP},
557 {
"XDG_DOCUMENTS_DIR",
"Documents", ICON_DOCUMENTS},
558 {
"XDG_DOWNLOAD_DIR",
"Downloads", ICON_IMPORT},
559 {
"XDG_VIDEOS_DIR",
"Videos", ICON_FILE_MOVIE},
560 {
"XDG_PICTURES_DIR",
"Pictures", ICON_FILE_IMAGE},
561 {
"XDG_MUSIC_DIR",
"Music", ICON_FILE_SOUND},
564 for (
int i = 0; i <
ARRAY_SIZE(xdg_items); i++) {
566 xdg_map, fsmenu, xdg_items[i].key, xdg_items[i].default_path, xdg_items[i].icon, home);
579 fp = setmntent(MOUNTED,
"r");
581 fprintf(stderr,
"could not get a list of mounted file-systems\n");
584 while ((mnt = getmntent(fp))) {
589 if (!
STRPREFIX(mnt->mnt_fsname,
"/dev")) {
592 if (
STRPREFIX(mnt->mnt_fsname,
"/dev/loop")) {
607 if (endmntent(fp) == 0) {
608 fprintf(stderr,
"could not close the list of mounted file-systems\n");
612 const char *
const xdg_runtime_dir =
BLI_getenv(
"XDG_RUNTIME_DIR");
613 if (xdg_runtime_dir !=
nullptr) {
616 BLI_path_join(filepath,
sizeof(filepath), xdg_runtime_dir,
"gvfs/");
620 for (
uint i = 0; i < dirs_num; i++) {
621 if ((dirs[i].type & S_IFDIR) == 0) {
632 if (
label !=
nullptr) {
634 const char *label_test =
label + 6;
656#if defined(__APPLE__)
664#define FS_UDIR_PATH(dir, icon) \
666 if (BLI_strnlen(dir, 3) > 2) { \
668 fsmenu_insert_entry(fsmenu, FS_CATEGORY_OTHER, dir, nullptr, icon, FS_INSERT_LAST); \
674 if (
UNLIKELY(script_dir->dir_path[0] ==
'\0')) {
679 script_dir->dir_path,
static unsigned long seed